436 瀏覽數

Bash Shell Script – 變數 $?

在 Shell Script Bash $開頭的是變數, $? 這個是有特殊的變數.

當執行指令時都會回傳一個執行後的代碼給變數 $?,成功的執行完指令後會回傳一個 0 值(有錯誤時會回傳 錯誤代碼).
利用 ping 的指令來看看 變數 $? 的變化.
ping 參數 一個封包 (-c 1) , 等待回應時間為一秒 (-w 1)

root@ubuntu:~# ping -c 1 -w 1 192.8.1.1
PING 192.8.1.1 (192.8.1.1) 56(84) bytes of data.

--- 192.8.1.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms

root@ubuntu:~# echo $?
1
root@ubuntu:~# ping -c 1 -w 1 172.16.15.130
PING 172.16.15.130 (172.16.15.130) 56(84) bytes of data.
64 bytes from 172.16.15.130: icmp_seq=1 ttl=64 time=0.050 ms

--- 172.16.15.130 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.050/0.050/0.050/0.000 ms
root@ubuntu:~# echo $?
0

可以很明顯看到當 ping 成功後回傳得值為 0 ,失敗則回傳 1 .

變數 $? 常會與 && || 一起使用,我們現來看一下 && || 的用法

  • cmd1 && cmd2 : 若 cmd1 執行正確且無錯誤 ($?=0),則執行 cmd2 ,反之若 cmd1 執行完畢且為錯誤 ($?≠0),則 cmd2 不執行.
  • cmd1 || cmd2 : 若 cmd1 執行正確且無錯誤 ($?=0),則 cmd2 不執行 ,反之若 cmd1 執行完畢且為錯誤 ($?≠0),則開始執行 cmd2.

下面的範例的語法是常用的架構 (這 && 與 || 的順序就是固定),用以判斷 command1 的執行是成功還是失敗,成功則執行 command2 失敗則執行 command 2

command1 && command2 || command3

使用上面所說的常用 && || 的判斷式的架構範例.

root@ubuntu:~# ping -c 1 -w 1 192.8.1.1 &> /dev/null && echo "This IP is unavailable." || echo "This IP is available."
This IP is available.
root@ubuntu:~# ping -c 1 -w 1 172.16.15.130 &> /dev/null && echo "This IP is unavailable." || echo "This IP is available."
This IP is unavailable.

語法說明 :
ping 參數 一個封包 (-c 1) , 等待回應時間為一秒 (-w 1)
&> (等同 2>&1 ) 標準輸出 (stdout)+標準錯誤輸出 (stderr) ,把執行結果內容導向至 /dev/null (空裝置,也就是不會把結果顯示在標準輸出)

簡化一下剛剛的指令
ping && echo “unavailable.” || echo “available.”
ping 成功後 ($?=0) echo “unavailable.”,因為 $?=0 所以後半段 || 就不會去執行了.
ping 失敗後 ($?≠0) ,不執行 echo “unavailable.”,因為 $?≠0 所以後半段 || 就會去執行 echo “available.” 了.

發表迴響