4

私はいくつかの奇妙な振る舞いに出くわしました(おそらく奇妙ではありませんが、私はそれを理解していません!)

bashの省略構文を使用してif/e、seステートメントを記述したいと思います。

[[ 1 -eq 1 ]] && echo "true" || echo "false"

上記のコードの出力は次のようになります。

true

これで、上記のコードは実際に正常に機能します。しかし、この次のコードはそうではありません:

[[ 1 -eq 1 ]] && infMsg "true" || infMsg "false"

infMsgは単なる関数です。上記のコードからの出力は次のとおりです。

true
false

「本当」とだけ言いたい。

&& ||の方法で欠けているものはありますか?構文は関数からの終了コードを処理しますか?

4

1 に答える 1

11

「infMsg」の終了コードが 0 (成功) ではないと思われます。コードの最初の部分を分解すると、次のようになります。

[[ 1 -eq 1 ]] && echo "true" || echo "false"

何が起こっているのですか:

  • (more info[here 1 )よりも優先順位が高い[[ 1 -eq 1 ]] && echo "true"ため、コードの部分が最初に評価されます。&&||
  • その前半は true を返します。次に、前半が true だったので、後半echo "true"でステートメントを実行します。(&& -> パート 1 が true の場合、パート 2 を実行)
  • これで|| echo "false". echo "true"エコーが正常に出力されたため、前半 ( ) が true を返したため、この部分は実際には実行されません( (||-> 部分 1 が false の場合、2 番目の部分を実行します)。 )。

コードの 2 番目の部分を分解すると、次のようになります。

[[ 1 -eq 1 ]] && infMsg "true" || infMsg "false"

最も可能性が高いのは次のとおりです。

  • [[ 1 -eq 1 ]] && infMsg "true"評価されます。最初の側面は真実です。次に、前半が true だったので、後半infMsg "true"で ステートメントを実行します。(&& -> パート 1 が true の場合、パート 2 を実行します)。
  • 今、私たちは持ってい|| infMsg "false"ます。前のコマンドの が成功 (0) と解釈されるステータス コードを返さなかった場合、infMsg "true" 前半は false と解釈され、infMsg "false"( (||-> パート 1 が false の場合、2 番目のパートを実行) がトリガーされます。)..

ここで取り上げる重要な情報:

  • || 前半が FALSE の場合にのみ後半を実行します。
  • && は、前半が TRUE の場合にのみ後半を実行します。
于 2013-03-21T04:36:35.213 に答える