Bash
同時檢查空輸出和成功退出狀態
我想在安裝程序腳本1中編寫以下測試:
if [ -n "`/etc/grub.d/30_os-prober`" ]; then install_dual_boot else install_linux_only fi
但是,也有可能
30_os-prober
沒有輸出,因為它以某種方式未能完成。如果30_os-prober
以非零退出狀態失敗,則假設雙引導情況會更安全。如何檢查是否成功
30_os-prober
沒有輸出?基本上,我想獲得類似於……的效果。
if [ -n "`/etc/grub.d/30_os-prober`" ]; then # Do stuff for a dual-boot machine install_dual_boot elif ! /etc/grub.d/30_os-prober >/dev/null; then # OS probe failed; assume dual boot out of abundance of caution install_dual_boot else install_linux_only fi
…但沒有兩次執行相同的命令。
首先,雖然它們在功能上是等價的,但
$(…)
被廣泛認為比…
——參見this、this和this更清晰。其次,您不需要使用$?
來檢查命令是成功還是失敗。我最近被吸引到第 2.9.1 節, Shell 和實用程序 的開放組基本規範的簡單命令(第 7 期) :“簡單命令”是一系列可選的變數分配和重定向,以任何順序,可選地後跟單詞和重定向,由控制運算符終止。
當需要執行給定的簡單命令時……
⋮ (等等,等等,等等……)
如果有命令名稱,則應按照命令搜尋和執行中的說明繼續執行。如果沒有命令名稱,但該命令包含命令替換,則該命令應以執行的最後一個命令替換的退出狀態完成。…
例如,
- 命令的退出狀態
ls -ld "module_$(uname).c"
是 的退出狀態
ls
,但是
- 命令的退出狀態
myfile="module_$(uname).c"
是 的退出狀態
uname
。所以ferada的回答可以簡化一點:
如果輸出=$(/etc/grub.d/30_os-prober) && [ -z "$output" ] # 即,如果**30_os-prober** *成功*產生無輸出 然後 install_linux_only 別的 install_dual_boot 是
請注意,僅對環境變數(或在整個腳本中可見的變數)使用全大寫名稱是一種很好的做法。有限範圍的變數通常以小寫命名(或者,如果您願意,也可以使用 camelCase)。