![](/img/trans.png)
[英]How can this bash script be made shorter and better? Is there a way to combine multiple curl statements and if statements in 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; }
。 在這里, { ;}
使echo
和exit
成為一起執行的組,而;
它們之間意味着無論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.