近期工作上很常需要使用Linux的Shell Script來批次處理檔案,但太久沒使用導致花了好多時間去找之前寫的程式碼,此篇特別記一下常見Shell Script常見技巧,包含迴圈、if判斷、逐行讀取等
以Shell Script完成批次工作
甚麼是Shell?
再開始討論以下內容前,先來看看維基百科怎麼說(參1),內容超級繞口,有看卻看懂。大致參考了其他作者的說法,根據筆者理解應該可歸納出幾個大重點
- Kernel可以控制硬體設備,而Shell的目的就是讓使用者能透過介面操作,實現通知Kernel,再由KerInel去驅動硬體。
- Shell又可依操作的介面分成GUI或CLI。
- Shell有不同種類,例如bash、Cshell等等,接下來主要會以bash作為程式的示範。
寫Shell的起手式
在Linux的terminal中,使用vi即可進入文字編輯模式,在檔案開頭會出現一行文字像是
#!/bin/bash (或者是其他的,如 #!/bin/csh)
在vi模式底下 # 代表注釋,但這裡的 #! 可不是代表注釋,這代表了接下來後面要使用何種解釋器(command interpreter)來解讀,同樣的功能但不同的解釋器會有不同的語法。
撰寫第一隻shell script
在Linux底下寫Shell Script似乎不能像在Python、C#等通用語言這麼隨興,筆者使用的經驗是,Shell Script對於空白是敏感的,例如:
#!/bin/bash
x="Hello Wolrd"
echo "$x" //Hello World
echo '$x' //$x
//=與x、Hello之間不可以有空白,否則會報錯
//$代表變數,雙引號內會先將變數換回原始資料,這裡也可以直接寫echo $x
//單引號內則直接視為字串
其他基礎技巧
從螢幕讀取數據應該也有機會使用到,特此紀錄一下(參2)
#!/bin/bash
echo -e "Please input your name: \c" #(\c迫使游標不換行)
read name
echo "Hello, $name"
常用Shell Script技巧
判別式或while迴圈
在bash中,條件式通常會用[ ]包覆,例如if、while。下面是個簡單的加法累計範例,if的下法請參考(參3)
#!/bin/bash
Start=1
Sum=0
Count=10
while [ $Count -gt 0 ] //注意[]內左右要留一個空格....不然會報錯
do //迴圈一定要有do 跟 done
Sum=$(expr $Start + $Sum) //expr與下列方法相同,可選一個自己喜歡的
Start=`expr $Start + 1`
Count=`expr $Count + 1`
done
echo "result is $Sum"
//判別式若是數字比對,會使用傳統的-gt -eq -lt等,若為文字判斷直接用=
//文字無法直接相加,需要加上expr才能進行運算
for迴圈及逐行讀取檔案
從1開始跑for迴圈,至21停止
#!/bin/bash
for var in $(seq 1 21)
do
echo $(expr $var + 1000)
done
逐行讀取檔案,並放進$line
#!/bin/bash
cat stn_list | while read line
do
echo $line
done
在Shell Script中呼叫sac
#!/bin/bash
export SAC_DISPLAY_COPYRIGHT=0
sac << EOF
r *$line*SAC;ch a $ptime_temp;w over;
q
EOF
參考資料