我正在尋找使用 &&, || 代替 bash 腳本中的“if”“else”塊
如何將以下兩個陳述句合并為一個。
[[ $? -ne 0 ]] && echo "Add User failed" && exit 1
[[ $? -eq 0 ]] && echo "User added successfully"
請幫忙!
uj5u.com熱心網友回復:
一般來說,我建議不要嘗試使用&&和||替換if ... then ... else塊。if陳述句具有清晰和直接的語意,但它們的組合&&并||經常以意想不到和難以理解的方式相互作用。
拿[[ $? -ne 0 ]] && echo "Add User failed" && exit 1。這里的問題是exit只有在為真時才會執行[[ $? -ne 0 ]](即,如果前一個命令失敗),并且命令成功(這echo就是最終的&&意思)。nowecho是一個非常簡單可靠的命令,幾乎永遠不會失敗;但是如果事情搞砸了,echo無法運行,我很確定你真的真的真的希望腳本退出而不是嘗試繼續。
這個的“正確”版本是[[ $? -ne 0 ]] && { echo "Add User failed" >&2; exit 1; }. 這里的{ ;}makeecho和exit一個組一起被執行,;它們之間的 the 表示exit不管成功與否都會被執行echo。順便說一句,我還在命令中添加>&2了echo將其訊息發送到標準錯誤(錯誤和狀態訊息的正確目的地)而不是標準輸出的命令。
您的第二個命令 ,[[ $? -eq 0 ]] && echo "User added successfully"沒有那個問題,但它確實有問題,$?即前一個命令的狀態......這是[[ $? -ne 0 ]] && ...事情,而不是您真正想要檢查的命令。這是 using 的一個常見問題$?,因為它被 shell 所做的每一件事所取代。如果你想對單個命令的退出狀態運行多個測驗,你幾乎需要立即將它存盤在一個變數中,然后測驗它:
commandThatMightFail
status=$?
[[ $status -eq 0 ]] && ...
[[ $status -nq 0 ]] && ...
但是,在您的情況下,您實際上并不需要第二次測驗。第一個應該退出腳本,這意味著如果它到達第二個,則原始命令必須成功。另外,在大多數情況下(包括這個),你最好不要使用$?,直接在測驗中使用命令。||所以這是我認為好的做法的少數用途之一:
commandThatMightFail || {
echo "Add User failed" >&2
exit 1
}
echo "User added successfully" >&2
請注意,這使用||而不是&&,因為如果命令失敗,則錯誤處理程式應該運行,而不是如果它成功。此外,這個組合安全的唯一原因是因為只||涉及一個(可能是因為錯誤處理程式退出),而不是多個相互糾纏的。如果錯誤條件沒有退出,你真的應該使用適當的if陳述句來獲得可預測的結果:
if commandThatMightFail; then
echo "User added successfully" >&2
else
echo "Add User failed" >&2
fi
或者,如果您希望它在一行中:
if commandThatMightFail; then echo "User added successfully" >&2; else echo "Add User failed" >&2; fi
uj5u.com熱心網友回復:
如果我對您正在嘗試做的事情做出一些常識性的猜測,我會得出:
([[ $? -ne 0 ]] && echo "Add User failed") || echo "User added successfully"
uj5u.com熱心網友回復:
在 Bash 程式中,通常使用“die”函式來列印錯誤訊息并退出程式。請參閱BashFAQ/101 - 通用實用程式函式(警告,死)。(還有在 bash 中,是否有等效的 die "error msg",但所有答案都有問題。)使用一個die函式,您可以簡單地執行以下操作:
add_user || die 'Add User failed'
echo 'User added successfully' >&2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/493720.html
上一篇:用jq決議時如何添加單引號?
