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
儘管這個如此簡單的腳本,
首先是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基礎很差所以有很多東西不知道, 導致開發相當緩慢, 也希望大神們能夠多多指導, 多謝多謝!