在 Shell 中常使用 $? 來判斷前一個指令執行的失敗與否,echo $? 為 0 代表成功,非 0 就代表失敗,其實還有幾個類似的內建變數也是相當的實用,下面就來介紹幾個常用的內建變數
- $?:指令或程式執行的回傳值,0 代表執行成功,0 以外的數字表示失敗
- $1:script 的第一個參數
- $2:script 的第二個參數
- $3:script 的第三個參數,以此類推
- $#:script 的參數數量
- $$:shell 執行的 PID
我們用一個簡單的 script 來做試範
#!/bin/bash
echo -e "The \$? =" $(echo $?)
echo -e "\nThe \$1 =" $(echo $1)
echo -e "\nThe \$2 =" $(echo $2)
echo -e "\nThe \$3 =" $(echo $3)
echo -e "\nThe \$# =" $(echo $#)
echo -e "\nThe \$\$ =" $(echo $$)
執行 test1.sh 並且加上三個參數 a、b、c
./test1.sh a b c
# 執行結果:
The $? = 0 # 執行成功
The $1 = a # 第一個參數
The $2 = b # 第二個參數
The $3 = c # 第三個參數
The $# = 3 # 參數的總量
The $$ = 1962 # 執行時的 PID
再來介紹兩個比較容易搞混的變數
- $@:代表參數的值
- $*:代表參數的值
這兩個變數雖然都是參數的值,但當它們被雙引號 " " 包起來時會有所不同,下面一樣用個 script 做例子
#!/bin/bash
echo "The \$* : "
for a in $*; do
echo \ $a;
done
echo -e "\nThe \"\$*\" : "
for a in "$*"; do
echo \ $a;
done
echo -e "\n====================\n"
echo "The \$@ : "
for a in $@; do
echo \ $a;
done
echo -e "\nThe \"\$@\" : "
for a in "$@"; do
echo \ $a;
done
執行 test2.sh 並且加上三個參數 a、b、“c d”
./test2.sh a b "c d"
# 執行結果:
The $* :
a
b
c
d
The "$*" :
a b c d
====================
The $@ :
a
b
c
d
The "$@" :
a
b
c d
上面的執行結果可以觀察到:
- $* 與 $@ 得到的結果是一樣的,都是 a、b、c、d 四個參數
- "$*" 在這邊是把所有的參數視為一個被雙引號包起來的變數 “a b c d”
- "$@" 則是被視為三個參數 a、b 與 “c d”
基本上 “$@” 才是符合實際上所輸入的參數情況,因此我們比較常使用的也是 “$@"
參考資料: