次のスクリプトを試しました
#!/bin/bash
var1="Test 1"
var2="Test 2"
if [ "$var1"="$var2" ]
then
echo "Equal"
else
echo "Not equal"
fi
それは私にEqual
を与えました。 Not equal
を印刷する必要がありますが
=
の周りにスペースを挿入した場合にのみ、意図したとおりに機能しました
if [ "$var1" = "$var2" ]
と印刷されたNot equal
なぜそうなのですか? "$var1"="$var2"
が"$var1" = "$var2"
と同じでないのはなぜですか?
また、if [ "$var1"= "$var2" ]
と書いたところ、
line 4: [: Test 1=: unary operator expected
それはどういう意味ですか?どうしてその期待する単項演算子なのか?
test
(または[ expr ]
)は組み込み関数です。 bashのすべての関数と同様に、引数を空白で区切られた単語として渡します。
Bashビルトインのマニュアルページにあるように、「各演算子とオペランドは別々の引数でなければなりません」。
これは、bashや他のほとんどのUnixシェルが機能する方法です。
変数の割り当てが異なります。
Bashでは、変数の割り当ての構文はname=[value]
です。 =
の前後に引用符で囲まれていないスペースを入れることはできません。これは、bashがこれを意図した割り当てとして解釈しないためです。 bashは、ほとんどの単語リストをパラメーター付きのコマンドとして扱います。
例えば。
# call the command or function 'abc' with '=def' as argument
abc =def
# call 'def' with the variable 'abc' set to the empty string
abc= def
# call 'ghi' with 'abc' set to 'def'
abc=def ghi
# set 'abc' to 'def ghi'
abc="def ghi"
シェルが読み取るとき
if ["$ var1" = "$ var2"]
4つの引数を使用してコマンド[を呼び出します。 [が組み込みコマンドであるか外部コマンドであるかは関係ありませんが、外部コマンド/ bin/[である可能性があることを理解すると役立つ場合があります。 2番目の引数はリテラル '='で、4番目の引数は ']'です。ただし、シェルが
if ["$ var1" = "$ var2"]
[は3つの引数のみを取得します: '='が追加された$ var1の展開、$ var2の展開、および ']'。 3つの引数のみを取得する場合、最後の引数は ']'であり、最初の引数は単項演算子であると想定されます。
既存の説明に追加するには、"$var1"="$var2"
は空でない単一の文字列であるため、条件付きでは常にtrueと評価されます。
[ "$var1"="$var2" ] && echo true
上記のコマンドは、常にtrue
を出力します(var1
およびvar2
空にする)。