[英]Order of execution of && and || in Bash
我正在使用 Bash 完成一些基本練習,我對&&
和||
的操作順序感到困惑 . 以下是一些可重現的示例。
# Example 1
true && false || echo pass
# pass
由於第一個true
被執行, &&
傳遞給false
並且false
被執行( true && false
)。 ||
評估false
並且由於左側有false
,因此執行echo pass
( false || echo pass
)。 到目前為止,一切都很好。
false && false || echo pass
# pass
由於第一個表達式是false
, &&
不會執行第二個false
。 但是,由於false || echo pass
的左側,會打印echo pass
。 false || echo pass
是假的。 到目前為止一切都很好。
[[ 2 -gt 3 ]] && echo t || echo f
# f
2
不大於3
,這意味着echo t
不會被執行。 然而, echo t || echo f
echo t || echo f
打印f
。 基於前面的兩個示例, echo t
應該返回一個非退出代碼並且不要在右側執行echo f
。
我錯過了什么?
a && b || c
a && b || c
等於( a && b ) || c
( a && b ) || c
,即。 左邊是一大表情。 &&
和||
具有相同的優先級,它們從左到右執行。 在[[ 2 -gt 3 ]] && echo t
中執行的最后一個命令是[[ 2 -gt 3 ]]
,它返回非零。 所以整個[[ 2 -gt 3 ]] && echo t
表達式的退出狀態是非零的——最后一個命令執行的退出狀態。
[[ 2 -gt 3 ]] && echo t || echo f
( [[ 2 -gt 3 ]] && echo t ) || echo f
( false && echo t ) || echo f
( false ) || echo f
echo f
[*] - 該規則適用於命令列表中的任何命令( )
{ }
&&
||
以及while
if
case
等復合結構中。你可以做一些有趣的事情,比如if case "$line" in a) false; ;; esac; then echo "line is not a"; fi
if case "$line" in a) false; ;; esac; then echo "line is not a"; fi
if case "$line" in a) false; ;; esac; then echo "line is not a"; fi
。 case
的退出狀態等於最后執行的命令的退出狀態,如果line
匹配a)
則為false
。
'&&' 和 '||' 運算符並不總是執行第二個操作數。 如果是整個表達式的結果,shell 將不會執行第二個操作數。
在評估 'cmd1 && cmd2' 時,如果 'cmd1' 失敗,則不執行 'cmd2' 並且結果為失敗。 否則,結果為執行 'cmd2' 的結果。
同樣,在評估 'cmd1 || cmd2',如果'cmd1'成功,'cmd2'不執行,結果為成功。 否則,結果為執行 'cmd2' 的結果。
當多個操作鏈接在一起時,從最左邊的對開始,並根據上述兩個規則對其進行評估。 然后用結果替換最左邊的對並重復。 例如:
運行多個命令,但在第一次失敗時停止並返回錯誤:
cmd1 && cmd2 && cmd3 || echo "Failed."
這相當於
$( $( cmd1 && cmd2 ) && cmd3 ) || echo "Failed."
如果 cmd1 失敗,則不執行 cmd2 第一對命令失敗。 因此 cmd3 沒有被執行並且 '||' 的左側運營商是失敗者。 這意味着必須執行 echo 命令。
或者,如果 cmd1、cmd2 和 cmd3 都成功,則 '||' 的左側運算符成功,因此不執行 echo 命令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.