Bash技巧:介紹 $0、$1、#、*、$? 的含義
在編寫 Linux bash shell 腳本時,經常會用到 $0、$1、$2、$#、$@、$*、$? 等參數,下面具體說明這些參數的含義。
假設執行 ./test.sh a b c 這樣一個命令,則可以使用下面的參數來獲取一些值:
•$0 對應 "./test.sh" 這個值。如果執行的是 ./work/test.sh, 則對應 ./work/test.sh 這個值,而不是隻返回文件名本身的部分。
•$1 會獲取到 a,即 $1 對應傳給腳本的第一個參數。
•$2 會獲取到 b,即 $2 對應傳給腳本的第二個參數。
•$3 會獲取到 c,即 $3 對應傳給腳本的第三個參數。$4、$5 等參數的含義依此類推。
•$# 會獲取到 3,對應傳入腳本的參數個數,統計的參數不包括 $0。
•$@ 會獲取到 "a" "b" "c",也就是所有參數的列表,不包括 $0。
•$* 也會獲取到 "a" "b" "c", 其值和 $@ 相同。但 $* 和 $@ 加上雙引號有所不同。"$*" 把所有參數合併成一個字符串,而 "$@" 會得到一個字符串參數數組。
•$? 可以獲取到執行 ./test.sh a b c 命令後的返回值。在執行一個前臺命令後,可以立即用 $? 獲取到該命令的返回值。該命令可以是系統自身的命令,可以是 shell 腳本,也可以是自定義的 bash 函數。0值爲執行成功;非0值爲執行失敗。
變量 含義
$0 當前腳本的文件名
$n 傳遞給腳本或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。
$# 傳遞給腳本或函數的參數個數(不包含$0)。
$* 傳遞給腳本或函數的所有參數("$*"會把所有參數當成一個字符串)。
$@ 傳遞給腳本或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。("$@"會把所有單數當成一個數組。)
$? 上個命令的退出狀態,或函數的返回值。
$$ 當前Shell進程ID。對於 Shell 腳本,就是這些腳本所在的進程ID。
通過腳本記憶特殊變量:
[root@ k8s-m01 ~] cat test.sh
#!/bin/bash
echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$#"
echo "$@"
echo "$*"
echo "$?"
[root@ k8s-m01 ~] sh test.sh a b c
test.sh
a
b
c
3
a b c
a b c
0
下面舉例說明 “@” 的差異。假設有一個 testparams.sh 腳本,內容如下:
[root@ k8s-m01 ~] cat test.sh
#!/bin/bash
for i in "$*"
do
echo '字符串:' $i
done
echo '----分割符----'
for i in "$@"
do
echo '數組:' $i
done
[root@ k8s-m01 ~] sh test.sh a b c
字符串: a b c
----分割符----
數組: a
數組: b
數組: c
可以看到,"$*" 只產生一個字符串,for 循環只遍歷一次。
而 "$@" 產生了多個字符串,for 循環遍歷多次,是一個字符串參數數組。
注意:
如果傳入的參數多於 9 個,則不能使用 $10 來引用第 10 個參數,而是要用${10} 來引用。
即,需要用大括號{}把大於 9 的數字括起來。
例如
${10} 表示獲取第 10 個參數的值,寫爲 $10 獲取不到第 10 個參數的值。
實際上,$10 相當於 ${1}0,也就是先獲取 $1 的值,後面再跟上 0,如果 $1 的值是 "first",則 $10 的值是 "first0"。