Bash論理テストを理解しようとすると、結果は反対です。

Bash論理テストを理解しようとすると、結果は反対です。

これはなぜゼロですか?

$ echo $(( 0 && 0 ))
0

これはなぜゼロですか?

$ echo $(( 1 && 0 ))
0

これはなぜゼロですか?

$ echo $(( 0 && 1 ))
0

これはなぜ1ですか?

$ echo $(( 1 && 1 ))
1

答え1

これは「と一致します。論理和「これは&&算術的文脈で意味するものです。真理値表は次のとおりです。

  |  F  |  T
--+-----+-----
F |  F  |  F
--+-----+-----
T |  F  |  T

「AとB」は、AとBの両方が真である場合にのみ真です。

シェルの算術的文脈では、演算子は次のようになります。C規格で定義されているように実装ここで、「true」はゼロ以外の値であり、「false」は0です。これは、実際には「true」(または「成功」)がゼロで、「false」(または「エラー」)がゼロ以外の値である終了コードの逆です。

また見なさい:

$ echo $((2 && 2))
1

$ echo $((-1 && 2))
1

答え2

man $SHELL

言う

&&     logical AND

したがって、ルールは、左がTRUEの場合にのみ右が評価されることです。 0と1のルールを使っているからです。 0は偽、1は真です。

それでは、コードについて話し合ってから説明します。

echo $(( 0 && 0 ))

&& - 左が 0 なので右が評価されないため、0 が印刷されます。

$ echo $(( 1 && 0 ))

&& - 左が 1 なので右を評価します。残念ながら、右は0なので、0が印刷されます。

echo $(( 0 && 1 ))

&& - 左が 0 なので右が評価されないため、0 が印刷されます。

echo $(( 1 && 1 ))

&& - 左が 1 で右も 1 なので右を評価するので、1 が印刷されます。

編集する

あるユーザーが指摘したように、SHELLは&&段落属性(論理属性も含む)を持っています。ロジックが常に短絡されるという意味ではありません。

関連情報