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

test-commandsリストが実行され、その戻りステータスがゼロの場合、後続のコマンドリストが実行されます。

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

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

ステータスの値は127ではなく、ゼロです。奇妙な声明:

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

なぜゼロではなくステータス127値がthenステートメントを呼び出すのですか?なぜbashでfalseにならないのですか?

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

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

Answers

スペースが必要です

''=1は文字列=1として解釈され、 testは空でない文字列を見つけます。 ''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