2016-12-24 96 views
1

我寫這所有的地方:如何模仿C++'X = X && F()`在bash

if (($x == 0)) ; then 
    mycommand 
    x=$? 
fi 

有沒有更簡單/簡短的方式與bash的短路&&做到這一點?

編輯: 我不關心$x的價值,除非它是零,即成功/失敗。

回答

3

因此,變量x只是前一個命令的結果?如果你的意思是你有一個像一系列連續的幾乎相同的塊:

if (($x == 0)) ; then my_command_1; x=$?; fi 
.... 
if (($x == 0)) ; then my_command_N; x=$?; fi 

然後,只需結合您的命令,這樣

my_command_1 \ 
&& ... \ 
&& my_command_N 

[更新]

在另一方面,如果命令分散在整個腳本中,我會這樣做:

x=true 
$x && my_command_1 || x=false 
... 
$x && my_command_2 || x=false 

或者更多discree T:

$do my_command_1 || do=: 
... 
$do my_command_2 || do=: 

,或者更可能的是,通過一個函數:

function check_and_do { [ -z "$failed" ] && "[email protected]" || failed=ouch; } 

check_and_do my_command_1 
.... 
check_and_do my_command_2 
+0

的命令出現在許多不同的地方和範圍。沒有像這樣連續的繼承。 – Museful

+0

什麼是'$ do my_command ||做=:'? '$ do'如何決定'my_command'是否執行? – Museful

+1

@Museful'do'要麼是未定義的,要麼'$ do'計算爲nothing =>您的命令運行;或'do'在出錯後被賦予':'值,'$ do'賦值爲空命令':'(它的參數,即你的命令被忽略)。 – xhienne

4
((x == 0)) && { mycommand; x=$?; } 
  • 裏面((...))你一般不需要用$前綴變量。

  • { ... }是一個組命令,允許您作爲一個單元執行多個命令,在這種情況下,作爲RHS的&&運營商。
    請注意,需要終止{ ... }中的最後一個命令,其中;(單線形式)。


一般來說,可以直接與&&(邏輯AND)和||(邏輯OR),但要注意這些(短路)經營者鏈命令等於優先(並像往常一樣是左聯合的)。

cmd1 && cmd2 && ... || cmdElse # first failing command triggers cmdElse 

意味着cmd1無條件地執行,並且,如果成功(退出代碼0),所有後續的命令執行,只要它們也取得成功。
第一個失敗的命令(非零退出代碼),如果有的話,觸發||子句。

如果相反,你想的||條款限制在一個特定的命令,使用一組命令:

cmd1 && { cmd2 || cmd2Else; } # cmd2Else only executes if cmd2 gets to execute and fails 

現在,如果cmd2得到執行所有與失敗cmdElse纔會調用。

爲了說明相等優先級的行爲:

cmd1 || cmd2 && cmd3 # conceptually: (cmd1 || cmd2) && cmd3 

cmd1無條件地執行,並且如果失敗,則執行cmd2。如果或者成功,則執行cmd3
如果兩者都失敗,cmd3永遠不會執行。