您的位置:首頁>正文

樹莓派智能家居:shell腳本之音樂清單

Shell腳本也是一個玩轉Linux非常有利的武器, 好吧, 其實我並不會……但是基於萬種語言歸於一宗的思想, 學過程式設計的應該能很快入手。

由於我的目標是開發音樂播放機, 所以就不採用傳統的敘述方式來一步一步shell入門了, 直接從應用角度開發, 一步到位。

音樂播放機至少應該可以增刪音樂檔, 檔排序, 隨機播放, 順序播放, 單曲迴圈。 首先我們先從增刪檔來入手。 因為資料庫的配置極其麻煩, 所以我們把自己的設定檔寫成txt檔, 方便存取操作, 那麼如果想往我們的設定檔raspberry.txt裡新添加一行資料怎麼辦呢?輸入下面命令:

echo "music1.wav" >

raspberry.txt #表示清空檔後輸入

echo "music2.wav" >> raspberry.txt #表示在檔案結尾部追加

查看檔內容呢?輸入下面命令:

cat raspberry.txt

刪除某一行呢?使用sed命令:

sed -i ‘2d’ raspberry.txt #注意, 這里加-i與不加-i區別是, 加-i能夠修改raspberry.txt這個檔。 不加只能在控制台顯示並不修改raspberry.txt這個檔。 2d表示第二行。

在這裡我想稍微擴展一下sed這個命令, 畢竟是一個非常強大的工具, 可以匹配, 替換, 標記, 甚至可以擴展腳本, 這個大家可以自行百度一下sed命令, 在這裡我僅僅舉幾個特殊的例子。

sed -i 's/abc/ABC/g' file.txt #把file.txt的abc全部替換成ABC

sed '/^abc/'d file.txt #把file.txt的以abc開頭的行全部刪除

sed -n 'p;n' file.txt #列印出奇數行

sed -n 'n;p' file.txt #列印出偶數行

好了, 現在增刪都可以實現了, 那麼我們就做一個腳本來通過命令自訂增加和刪除音樂檔吧, 腳本名字假設為ps.sh, 內容如下:

#!/bin/bash

if [ "$1" == "add" ] && [ ! -d "$2" ]

then

path=$2

echo $2>>rasp.txt

echo "$2 has been add to playlist"

elif [ "$1" == "del" ] && [ ! -d "$2" ]

then

paths=$2

temp=${paths/////}

sed -i "/^$temp/"d rasp.txt

echo "$2 has been delete from playlist"

else

echo "file not exist!"

fi

具體使用方法:

新增文件:sh ps.sh add /home/1.wav

刪除檔:sh ps.sh del /home/1.wav

儘管這個如此簡單的腳本,

也是極其耗費心力, 短短幾句話花費了我至少6個小時的時間查資料、學習。 下面我從這個腳本中所遇到的問題中來一個個講解。

首先是shell腳本輸入變數的接收, 這個還是比較簡單的, 直接使用$1、$2……就能直接訪問傳入的參數, 比如, sh ps.sh add /home/1.wav這句話中, add是$1, /home/1.wav是$2。

接下來便是判斷語句, 標準判斷語句, if [ condition ] then; dosomething fi, 其中[ ! -d "$2" ]表示第二個參數是否存在。

比較難的一點在於sed -i "/^$temp/"d rasp.txt這一句。 首先sed如果直接在命令列裡面敲代碼我們都很容易理解如sed ‘/abc/d’ file.txt, 直接寫好一個字串進行匹配或者刪除, 但是在shell腳本裡並不能直接引用變數, 即我不能寫sed ‘/$var/d’ file.txt, 因為單引號是硬解析, 會認為$var是一個字串而不是一個變數, 所以在shell裡面引用變數的方法有四種, 以替換字串為例:

1、eval sed ’s/$a/$b/’ filename

2、sed "s/$a/$b/" filename

3、sed ’s/’$a’/’$b’/’ filename

4、sed s/$a/$b/ filename

在這裡我用的是第二種, 雙引號, 雙引號是軟解析, 會識別shell的變數, 從而實現查找特定字元並刪除這一行。

好了, 到這裡刪除增加就完畢了, 剛剛接觸shell基礎很差所以有很多東西不知道, 導致開發相當緩慢, 也希望大神們能夠多多指導, 多謝多謝!

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示