簡體   English   中英

&& 和 || 的執行順序在 Bash

[英]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 )。 到目前為止,一切都很好。

示例 2

false && false || echo pass
# pass

由於第一個表達式是false&&不會執行第二個false 但是,由於false || echo pass的左側,會打印echo pass false || echo pass是假的。 到目前為止一切都很好。

示例 3

[[ 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

我錯過了什么?

  1. 總的一般規則是:任何表達式都有最后執行的命令的退出代碼。 [*]
  2. 分組。 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.

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