2013-02-12 40 views
8

我在慶典與||相呼應和&&

echo this || echo that && echo other 

嘗試下面的命令這使輸出

this 
other 

我din't明白!

我的乾燥運行進入這種方式:

  1. echo this || echo that && echo other意味着true || true && true
  2. 由於,&&具有more precedence||,第二表達式計算第一
  3. 由於,both are true,所述||被評估這也給真正。
  4. 因此,我的結論輸出是:

其他

從Java的背景,其中&&||更多的優先級分別爲,我無法將此與bash聯繫起來。

任何投入將是非常有益的!

+0

注意兩者相同的優先順序從左到右聯想 – 2013-02-12 16:20:50

回答

12

從命令

列表的man bash

3.2.3解釋是由運營商中的一個分隔的一個或多個管道的序列 ';', '&', '& &' ,或'||',並且可選地以';','&'或換行符之一終止。

這些列表的運營商,「& &」和「||」具有相同的優先級,後跟「;」和「&」,它具有相等的優先級。

所以,你的例子

echo this || echo that && echo other 

可以讀到這樣

(this || that) && other 
2

man bash

這些名單的經營者,& &和||具有相同的優先權,其次是 ;和&,它們具有相同的優先權。

所以你的輸出是預期的。

1

我想你已經知道了。運算符優先級不會像bash那樣工作。在你的例子中,一切都從左到右。

2

在bash中,&&||等於優先和關聯到左側。見Section 3.2.3 in the manual for details

所以,你的例子被解析爲

$ (echo this || echo that) && echo other 

,因此只的或運行的左側,因爲這成功的右側並不需要運行。

+0

+1這是我正要給的答案:) – 2013-02-12 16:16:07

2

bash中的布爾值評估是短路的:true || false將永遠不會評估false操作數,因爲true操作數足以確定操作的結果。同樣,false && true不會評估true操作數,因爲它不能更改表達式的值。

bash的布爾值評估實際上是使用主要是用於控制操作數的條件評估,而不是它們的順序。典型用法是do_foo || do_bar_if_foo_failsdo_foo && do_bar_only_if_foo_has_succeeded

在任何情況將您的echo that命令被執行,因爲echo thistrue,並且確定整個echo this || echo that子表達式的值。

1

讓我們來解釋一下這個是幹什麼:

echo this || echo that && echo other 

echo this || echo that - >echo that只有echo this FAIL S.

&& echo other - >echo other只有當前的指令爲&&成功。

所以基本上:

echo this --->成功---->echo that ---->自echo this成功--->echo other --->的原因echo this || echo that被正確執行執行不執行。