標籤:style blog http io os ar for 檔案 art
前面已經講到,變數名只能包含數字、字母和底線,因為某些包含其他字元的變數有特殊含義,這樣的變數被稱為特殊變數。
例如,$ 表示當前Shell進程的ID,即pid,看下面的代碼:
複製純文字新視窗
- $echo $$
$echo $$
運行結果
29949
特殊變數列表
變數 |
含義 |
$0 |
當前指令碼的檔案名稱 |
$n |
傳遞給指令碼或函數的參數。n 是一個數字,表示第幾個參數。例如,第一個參數是$1,第二個參數是$2。 |
$# |
傳遞給指令碼或函數的參數個數。 |
$* |
傳遞給指令碼或函數的所有參數。 |
[email protected] |
傳遞給指令碼或函數的所有參數。被雙引號(" ")包含時,與 $* 稍有不同,下面將會講到。 |
$? |
上個命令的退出狀態,或函數的傳回值。 |
$$ |
當前Shell進程ID。對於 Shell 指令碼,就是這些指令碼所在的進程ID。 |
命令列參數運行指令碼時傳遞給指令碼的參數稱為命令列參數。命令列參數用 $n 表示,例如,$1 表示第一個參數,$2 表示第二個參數,依次類推。
請看下面的指令碼:
複製純文字新視窗
- #!/bin/bash
-
- echo "File Name: $0"
- echo "First Parameter : $1"
- echo "First Parameter : $2"
- echo "Quoted Values: [email protected]"
- echo "Quoted Values: $*"
- echo "Total Number of Parameters : $#"
#!/bin/bashecho "File Name: $0"echo "First Parameter : $1"echo "First Parameter : $2"echo "Quoted Values: [email protected]"echo "Quoted Values: $*"echo "Total Number of Parameters : $#"
運行結果:
$./test.sh Zara AliFile Name : ./test.shFirst Parameter : ZaraSecond Parameter : AliQuoted Values: Zara AliQuoted Values: Zara AliTotal Number of Parameters : 2
$* 和 [email protected] 的區別$* 和 [email protected] 都表示傳遞給函數或指令碼的所有參數,不被雙引號(" ")包含時,都以"$1" "$2" … "$n" 的形式輸出所有參數。
但是當它們被雙引號(" ")包含時,"$*" 會將所有的參數作為一個整體,以"$1 $2 … $n"的形式輸出所有參數;"[email protected]" 會將各個參數分開,以"$1" "$2" … "$n" 的形式輸出所有參數。
下面的例子可以清楚的看到 $* 和 [email protected] 的區別:
複製純文字新視窗
- #!/bin/bash
- echo "\$*=" $*
- echo "\"\$*\"=" "$*"
-
- echo "\$@=" [email protected]
- echo "\"\$@\"=" "[email protected]"
-
- echo "print each param from \$*"
- for var in $*
- do
- echo "$var"
- done
-
- echo "print each param from \$@"
- for var in [email protected]
- do
- echo "$var"
- done
-
- echo "print each param from \"\$*\""
- for var in "$*"
- do
- echo "$var"
- done
-
- echo "print each param from \"\$@\""
- for var in "[email protected]"
- do
- echo "$var"
- done
#!/bin/bashecho "\$*=" $*echo "\"\$*\"=" "$*"echo "\[email protected]=" [email protected]echo "\"\[email protected]\"=" "[email protected]"echo "print each param from \$*"for var in $*do echo "$var"doneecho "print each param from \[email protected]"for var in [email protected]do echo "$var"doneecho "print each param from \"\$*\""for var in "$*"do echo "$var"doneecho "print each param from \"\[email protected]\""for var in "[email protected]"do echo "$var"done
執行 ./test.sh "a" "b" "c" "d",看到下面的結果:
$*= a b c d"$*"= a b c d[email protected]= a b c d"[email protected]"= a b c dprint each param from $*abcdprint each param from [email protected]abcdprint each param from "$*"a b c dprint each param from "[email protected]"abcd
退出狀態$? 可以擷取上一個命令的退出狀態。所謂退出狀態,就是上一個命令執行後的返回結果。
退出狀態是一個數字,一般情況下,大部分命令執行成功會返回 0,失敗返回 1。
不過,也有一些命令返回其他值,表示不同類型的錯誤。
下面例子中,命令成功執行:
$./test.sh Zara AliFile Name : ./test.shFirst Parameter : ZaraSecond Parameter : AliQuoted Values: Zara AliQuoted Values: Zara AliTotal Number of Parameters : 2$echo $?0$
$? 也可以表示函數的傳回值,後續將會講解。
Shell教程3-Shell特殊變數