我寫這所有的地方:如何模仿C++'X = X && F()`在bash
if (($x == 0)) ; then
mycommand
x=$?
fi
有沒有更簡單/簡短的方式與bash的短路&&
做到這一點?
編輯: 我不關心$x
的價值,除非它是零,即成功/失敗。
我寫這所有的地方:如何模仿C++'X = X && F()`在bash
if (($x == 0)) ; then
mycommand
x=$?
fi
有沒有更簡單/簡短的方式與bash的短路&&
做到這一點?
編輯: 我不關心$x
的價值,除非它是零,即成功/失敗。
因此,變量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
((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
永遠不會執行。
的命令出現在許多不同的地方和範圍。沒有像這樣連續的繼承。 – Museful
什麼是'$ do my_command ||做=:'? '$ do'如何決定'my_command'是否執行? – Museful
@Museful'do'要麼是未定義的,要麼'$ do'計算爲nothing =>您的命令運行;或'do'在出錯後被賦予':'值,'$ do'賦值爲空命令':'(它的參數,即你的命令被忽略)。 – xhienne