web-dev-qa-db-ja.com

スペースに囲まれていないと、equal演算子が機能しないのはなぜですか?

次のスクリプトを試しました

#!/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

それはどういう意味ですか?どうしてその期待する単項演算子なのか?

35
Andrew-Dufresne

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"
61
CB Bailey

シェルが読み取るとき

 if ["$ var1" = "$ var2"] 

4つの引数を使用してコマンド[を呼び出します。 [が組み込みコマンドであるか外部コマンドであるかは関係ありませんが、外部コマンド/ bin/[である可能性があることを理解すると役立つ場合があります。 2番目の引数はリテラル '='で、4番目の引数は ']'です。ただし、シェルが

 if ["$ var1" = "$ var2"] 

[は3つの引数のみを取得します: '='が追加された$ var1の展開、$ var2の展開、および ']'。 3つの引数のみを取得する場合、最後の引数は ']'であり、最初の引数は単項演算子であると想定されます。

7
William Pursell

既存の説明に追加するには、"$var1"="$var2"は空でない単一の文字列であるため、条件付きでは常にtrueと評価されます。

[ "$var1"="$var2" ] && echo true

上記のコマンドは、常にtrueを出力します(var1およびvar2空にする)。

3
Jahid