2016-08-08 20 views
1

大括號是否適合替代其他構造?linux大括號而不是if-then-else-fi do-done

[ -n "$TEST" ] && { XX='yes'; echo 'yes' } || { XX='no'; echo 'no' } 

VS

if [ -n "$TEST" ] ; then 
     XX='yes'; echo 'yes' 
    else 
     XX='no'; echo 'no' 
    fi 

另:

for num in {000..2}; do echo "$num"; done 

for num in {000..2}; { echo "$num"; } 
+0

可以說這最好是兩個單獨的問題 - 我們已經有了一個Q&A知識庫條目,「是A && B || C是bash中的三元運算符嗎?」問題,但我們無法整合,因爲還有一個關於後者語法爲什麼起作用的問題。 –

回答

3

在你的第一個例子,A && B || Cif A; then B else C有不同的行爲,如果B具有非零退出狀態。

[ -n "$TEST" ] && { echo this; false; } || { echo "this too?"; } 

你的第二個例子是 應該 是一個語法錯誤。文檔中沒有任何內容說明您可以用另一個複合命令替換do/done對(這就是{...})。

更新:bash的維護人員告訴我,這是一個未記錄的功能,它提供了與原始Bourne shell中未記錄的功能的向後兼容性。

+0

第一個好點!這解釋了我的問題的原因謝謝!在'for'聲明中,在Ubuntu和Debian上運行良好。 – fcm

+1

因此它。儘管如此,我不確定我會依賴於它。它似乎最多隻是一個無證的功能。 – chepner

+1

@fcm它在bash和ksh中工作,但不在其他任何shell中。 'dash'無法處理它,而這在Debian和Ubuntu上是默認的'/ bin/sh'。 –