shell相關(1)--bash

Bash技巧:介紹 $0、$1、22、#、@@、*、$? 的含義

在編寫 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"。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章