【Linux】以Shell Script完成批次工作

近期工作上很常需要使用Linux的Shell Script來批次處理檔案,但太久沒使用導致花了好多時間去找之前寫的程式碼,此篇特別記一下常見Shell Script常見技巧,包含迴圈、if判斷、逐行讀取等

 

 

以Shell Script完成批次工作


甚麼是Shell?
再開始討論以下內容前,先來看看維基百科怎麼說(參1),內容超級繞口,有看卻看懂。大致參考了其他作者的說法,根據筆者理解應該可歸納出幾個大重點

  1. Kernel可以控制硬體設備,而Shell的目的就是讓使用者能透過介面操作實現通知Kernel,再由KerInel去驅動硬體
  2. Shell又可依操作的介面分成GUICLI
  3. Shell有不同種類,例如bashCshell等等,接下來主要會以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中,條件式通常會用[ ]包覆,例如ifwhile。下面是個簡單的加法累計範例,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

 

參考資料

  1. https://zh.wikipedia.org/wiki/%E6%AE%BC%E5%B1%A4
  2. https://www.cyut.edu.tw/~ywfan/1109linux/201109chapter11shell%20script.htm
  3. https://www.opencli.com/linux/shell-script-if-else-elseif