簡體   English   中英

如何將 bash 腳本語句合二為一

[英]How to combine bash script statements into one

我正在尋找使用 &&, || 代替 bash 腳本中的“if”“else”塊

如何將以下兩個語句合並為一個。

[[ $? -ne 0 ]] && echo "Add User failed" && exit 1
[[ $? -eq 0 ]] && echo "User added successfully"

請幫忙!

一般來說,我建議不要嘗試使用&&|| 替換if ... then ... else塊。 if語句具有清晰直接的語義,但是&&||的組合經常以意想不到和難以理解的方式互動。

[[ $? -ne 0 ]] && echo "Add User failed" && exit 1 [[ $? -ne 0 ]] && echo "Add User failed" && exit 1 這里的問題是exit[[ $? -ne 0 ]] [[ $? -ne 0 ]]為真(即如果前一個命令失敗),並且echo命令也成功(這就是最終&&的含義)。 現在echo是一個非常簡單可靠的命令,幾乎永遠不會失敗; 但如果事情搞得一團糟以至於echo無法運行,我敢肯定你真的真的真的希望腳本退出而不是嘗試繼續。

這個的“正確”版本是[[ $? -ne 0 ]] && { echo "Add User failed" >&2; exit 1; } [[ $? -ne 0 ]] && { echo "Add User failed" >&2; exit 1; } [[ $? -ne 0 ]] && { echo "Add User failed" >&2; exit 1; } 在這里, { ;}使echoexit成為一起執行的組,而; 它們之間意味着無論echo成功與否都會執行exit 順便說一句,我還在echo命令中添加了>&2以將其消息發送到標准錯誤(錯誤和狀態消息的正確目的地)而不是標准輸出。

您的第二個命令[[ $? -eq 0 ]] && echo "User added successfully" [[ $? -eq 0 ]] && echo "User added successfully"沒有這個問題,但是它確實有$? 將是前一個命令的狀態......這是[[ $? -ne 0 ]] && ... [[ $? -ne 0 ]] && ...東西,而不是您實際要檢查的命令。 這是使用$? ,因為它被 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

如果我對您正在嘗試做的事情做出一些常識性的猜測,我會得出:

([[ $? -ne 0 ]] && echo "Add User failed") || echo "User added successfully"

在 Bash 程序中,通常使用“die”函數來打印錯誤消息並退出程序。 請參閱BashFAQ/101 - 通用實用程序函數(警告,死) 在 bash 中也有類似的 die "error msg" ,但所有答案都有問題。)使用die函數,您可以簡單地執行以下操作:

add_user || die 'Add User failed'
echo 'User added successfully' >&2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM