なぜifステートメントが `if ['' = 1]で実行されるのか;次に「true」をエコーし​​ます。そうでない場合は「false」をエコーし​​ます。 fi`?

2020-02-14 bash if-statement
if test-commands; then
  consequent-commands;
[elif more-test-commands; then
  more-consequents;]
[else alternate-consequents;]
fi

テストコマンドリストが実行され、戻りステータスがゼロの場合、結果コマンドリストが実行されます。

bashに''=1ステータスを表示します。

''=1
bash: =1: command not found
echo $?
127

ステータスの値は127であり、ゼロではありません。奇妙な声明:

if [ ''=1 ] ; then echo "true"; else echo "false"; fi
true

ゼロのinvoke thenステートメントではなく、ステータス127値はなぜですか?なぜbashでfalseを取得できないのですか?

@ДмитрийШатов

=1
bash: =1: command not found
echo $?
127

Answers

スペースが必要です

''=1は文字列=1として解釈され、 テストは空でない文字列を見つけます。 ''1を比較したい場合は、

[ '' = 1 ]

なぜステータス127

man bash

...その関数が定義されていない場合、シェルはエラーメッセージを出力し、終了ステータス127を返します。

これは、文字列比較操作であるためです。

if [ "$a" = "$b" ]
then
    echo 'true'
else
    echo 'false'
fi

2つの文字列を比較するときは、 =ではなく!=を使用する必要があります。これは、比較の反対になります[ "$a" = "$b" ]

if [ "$a" != "$b" ] 
then
    echo 'false'
else
    echo 'true'
fi

Related