2

我正在嘗試使用Logical & &和||的等價性。運營商到'如果其他情況'條件,我想驗證,如果這種理解是正確的。如果條件 考慮這一點,相關的礦山表示如果然後通過邏輯&&和||表示

if (flag="$value") then 
function1 (p1) 
rc=$? 
    if ("$rc"=0) then 
    function2 (p2) 
    fi 
elif (flag="$value2") then 
function1 (p1) 
rc=$? 
    if ("$rc"=0) then 
    function2 (p2) 
    fi 
else 
echo "Msg" 
fi 

寫在邏輯& &和術語||作爲

(([ flag = "$value" ] && function1 (p1)) && function2 (p2)) || 
    (([ flag = "$value2" ] && function1 (p2)) && function2 (p2)) || 
    echo "message" 

我的Q的是:

  • 可以在上述方法始終使用。有什麼需要注意的事項和注意事項
  • 在()括號內的其他地方有一些談話,說明一個新的shell的變量不可用於父進程。我想知道如何將這些運算符分組來指示優先級,如果不是那些()括號。

@Chepner。 Thx的澄清。 所以在一個case語句看起來像這樣

optf=false 
opte=false 
optp=false 

case $opt in 

    p) ... 
    (($opte || $optf) && [ -n "$s1" ]) && echo "error message" 

以上可改寫爲

{{ $opte || $optf } ; && [ -n "$s1" ] ; } && echo "error message" 

,它會因此翻譯這樣的邏輯:當您遇到-p選項,檢查是否OPTE或optf是真的。如果其中任何一個爲真,並且s1有值,則輸入錯誤消息。 會是這種情況,還是有一些漏洞被堵塞。 Gotcha-我沒有注意到「;」 。與{}; - 我應該能夠按我想要的方式分派我的運營商?

+0

它是哪個外殼? – anubhava

+0

請從有效的shell開始。你的'if ... else'語句不是。 – chepner

+0

你好,謝謝。它的KSH – user1874594

回答

4

注意

if command1; then 
    command2 
else 
    command3 
fi 

不等同於command1 && command2 || command3

  • 如果command1失敗,command2被跳過,command3運行,符合市場預期。
  • 如果command1成功,並且command2運行併成功command3被跳過,如預期。
  • 如果command1成功,並且command2運行並且失敗,則運行command3,這與if語句不同。

您將需要使用類似:

command1 && { command2; true; } || command3 

這將迫使右手操作數&&成功,而不管command2的成功,讓command3command1成功永遠不會運行。

+0

Thx。你是否也可以添加一個關於()括號用於指導操作符優先級的效果的註釋,而不是用於產生其變量不可用的新shell的效果。 – user1874594

+0

您可以使用'{...}'來產生相同的效果,而不會產生子外殼。對'()'內的變量所做的任何更改都不會保留在子外殼之外,而{{}內部的更改是。 – chepner

+0

我通過澄清更新了問題。只要檢查以上是否正確。 Thx'的收益 – user1874594