HOWTO · Bash

Bash の文字列比較演算子

この記事では、if ステートメントを使用した Bash での文字列比較について説明します。

このページの内容

Bash の [ コマンドを使う if 文で、引用符で囲んだ2つの文字列が同じ値かどうかを確認できます。[ "$first" = "$second" ] では、[ がコマンド名で、引用符で囲まれた値、=、閉じ角括弧の ] はそれぞれ別の引数です。Bash が各引数を個別に渡せるよう、それらの間のスペースを保ってください。

Bash の if で文字列を比較する

次の完全な例では、2つの文字列変数を比較し、一致した場合にメッセージを表示します。別の文字列を比較するには、どちらかの値を置き換えてください。

first="Hello"
second="Hello"
if [ "$first" = "$second" ]; then
    echo "Strings are equal"
else
    echo "Strings are different"
fi

この例を実行したときの標準出力は次のとおりです。

Strings are equal

比較を行うのは Bash の [ コマンドです。このコマンドが成功すると if は最初の分岐を実行し、失敗すると else の分岐を実行します。変数展開をそれぞれ引用符で囲むと、値にスペースが含まれる場合や値が未設定の場合も、各値が1つのテスト引数として扱われます。上の出力は Strings are equal で、このラベルは例の変更できない出力の一部として英語のまま表示されています。

値をスクリプト内の前の処理で用意する場合は、条件式の前に変数を設定します。first="Hello there" のような代入では、= の前後にスペースを入れません。一方、比較演算子の前後には、テスト式の中でスペースが必要です。引用符は各展開を1つの引数にまとめますが、比較される値には含まれません。比較では大文字と小文字や先頭・末尾のスペースも含め、文字列全体を確認するため、Hello と hello は異なる値です。

文字列の等価判定に = と == を使う

[ ... ] の中では、2つの文字列が等しいかを調べるのに = を使います。Bash のこのコマンドでは、文字列比較に == も使えるため、[ "$first" == "$second" ] も同じ条件を表します。これらの演算子は左右の値を比較します。一方、first="Hello" の = は変数に値を代入します。

演算子の前後にはスペースを入れてください。[ "$first" = "$second" ] では、[ がコマンド名で、引用符で囲まれた各値、演算子、閉じ角括弧の ] は別々の引数です。シェルが引数の区切りを認識するために、このスペースが必要です。たとえば [ "$first"="$second" ] は、2つの値と等価演算子ではなく、テスト対象となる空でない1つの文字列を渡すため、意図した比較になりません。

この Bash のテストで通常の文字列の等価判定を行うなら、= が明確な選択肢で、== も使用できます。どちらか一方を選び、スクリプト内で一貫して使ってください。どちらの比較演算子も、変数に値を代入する = と混同しないようにします。条件が真になるのは、両方の値が完全に一致した場合だけです。大文字と小文字を区別しない比較や前後のスペースの除去が必要な場合は、値を変換してから比較してください。等価判定そのものが値を正規化することはありません。

!= で文字列が異なるかを調べる

値が異なるかを調べるには、同じ位置に != を使います。次の単独で実行できる例は、2つの値に応じた分岐のメッセージを表示します。

first="Hello"
second="World"
if [ "$first" != "$second" ]; then
    echo "Strings are different"
else
    echo "Strings are equal"
fi
Strings are different

文字列が異なる場合は then の分岐が実行され、それ以外の場合は Bash が else を実行します。= の場合と同じように、両方の値を引用符で囲み、!= の前後のスペースを保ってください。ユーザー入力やコマンド出力にこの方法を適用するには、まず各値を変数に代入し、必要な条件に合う演算子で変数を比較します。

2つの名前や設定値が一致しないことを報告するなど、変化を検出して次の処理を決める場合に、この形式を使えます。else の分岐を用意すると、反対のケースで何が起きるかもスクリプトから読み取れます。等価判定と同じく、引用符で囲むとスペースを含む値も1つのテスト引数として扱われます。演算子を2つの引用符付きの値の間に置き、最後の ] の前にもスペースを入れてください。これにより、Bash が期待する引数の構造を保てます。