Linux Shell Script 的筆記

有時,我們會寫一些 Shell Script 之類的小工具來管理或操作 Linux 系統,以減少煩瑣的指令輸入。不過在 Shell Script 中,常有一些隱晦又難理解的語法或表示法,每當需要用時,都需要靠 google 大神或 鳥哥 的幫助來找尋。

這些資料大多是我在網路上搜尋的記錄,以便日後遇到時,可以快速地查尋。

基本語法

if ... then 述句

1
2
3
4
5
6
7
if [ condition1 ]; then
# do something 1
elif [ condition2 ]; then
# do something 2
else
# others
fi

while 及 until 述句

1
2
3
4
5
6
7
8
9
10
11
12
# 當 condition 成立時,就執行迴圈
while [ condition ]
do
# do something
done

# 當 condition 成立時,就終止迴圈
until [ condition ]
do
# do something
done

for 迴圈

1
2
3
4
5
6
7
8
9
for var in word1 word2 …
do
# do something
done

for (( 初始值; 限制值; 執行步階 ))
do
# do something
done

case 判斷

1
2
3
4
5
6
7
8
9
10
11
case word in
pattern1)
# do something 1
;;
pattern2)
# do something 2
;;
*)
# 都不符合,就執行這的程式
;;
esac

function

1
2
3
function function_name() {
# code
}

函式有幾個要注意的地方:

  • 在使用函式之前一定要先定義它,也就是在一個 Shell Script 中,一定要先寫函式的內容,在檔案最後再寫會呼叫函式的程式部份。
  • 在 Shell Script 中的變數全部都是全域變數 (Global),所以在函式中的變數也會影響函式外的其他部份。
  • 命令列輸入的參數在 Shell Script 中是以 $1, $2.... 來讀取,但是這些參數並不會在函式中出現。所以必須使用傳遞參數的方式來將要在函式中使用的變數傳給該函式。傳遞的方法和在命令列中使用 Shell Script 的方式一樣,例如:name arg1 arg2..。傳進函式的變數會以 $1,$2... 來儲存,這和命令列傳給 Shell Script 的參數名稱一樣但內容不同。

$ 開頭的內隱變數

變數名稱 說明
$? 表示上一個指令的離開狀況,一般指令正常離開會傳回 0。不正常離開則會傳回 1、2 等數值。
$$ 這一個 shell 的 process ID number
$! 最後一個在背景執行的程式的 process number
$- 這個參數包含了傳遞給 shell 旗標 (flag)
$n n 爲數字。$1 代表第一個參數,$2 則為第二個參數,依此類推。而 $0 為這個 shell script 的檔名。
$# Shell Script 參數的個數
$* 包含所有輸入的參數;將所有參數無間隔的連在一起,存成一個單一的參數。也就是說 $* 代表了 "$1 $2 $3..."。
$@ 包含所有輸入的參數;將所有參數以空白為間隔,存在 $@ 中。也就是說 $@ 代表了 "$1" "$2" "$3"....。

條件判斷

運算元:test 或 [condition]。 注意 [ ] 中的空白間隔。

判斷句 說明
-n str1 字串 str1 的長度大於 0 則傳回 true。
-z str1 字串 str1 的長度等於 0 則傳回 true。
str1 字串 str1 不是 null 則傳回 true。
str1 = str2 str1 等於 str2 則傳回 true。等號二邊有空白。
str1 != str2 str1 不等於 str2 則傳回 true。!= 的二邊有空白。
a -eq b Equal,等於。a 等於 b 則傳回真 (true)。
a -ne b Not equal,不等於。a 不等於 b 則傳回真 (true)。
a -gt b Greater than,大於。a 大於 b 則傳回真 (true)。
a -lt b Less Than,小於。a 小於 b 則傳回真 (true)。
a -ge b Greater or equal,大於或等於。a 大於或等於 b 則傳回真 (true)。
a -le b Less or equal,小於或等於。a 小於或等於 b 則傳回真 (true)。
-e file 檢查 file 如存在則傳回真 (true)。
-d file 檢查 file 為目錄則傳回真 (true)。
-f file 檢查 file 是一般的檔案則傳回真 (true)
-L file 檢查 file 是連結檔則傳回真 (true)。
-u file 檢查 file 的 SUID 己設定則傳回真 (true)。
-g file 檢查 file 的 SGID 己設定則傳回真 (true)。
-s file 檢查 file 的檔案長度大於 0 則傳回真 (true)。
-z file 檢查 file 的檔案長度等於 0 則傳回真 (true)。
-r file 檢查 file 可以讀則傳回真 (true)。
-w file 檢查 file 可以寫則傳回真 (true)。
-x file 檢查 file 可以執行則傳回真 (true)。