Bash で文字列を比較する方法

Suraj Joshi 2021年3月5日
Bash で文字列を比較する方法

様々な比較演算子を使って文字列を比較し、正規表現を使って文字列に部分文字列が含まれているかどうかを調べます。

Bash での文字列比較

文字列比較とは、与えられた文字列が同じかどうかを調べることです。2つ以上の文字列が同じ長さで、同じ文字列を含んでいれば同じです。

条件に応じて真または偽を返す様々な文字列比較演算子を使用します。広く使われている文字列比較演算子には、以下のようなものがあります。

string1 = string2 [ コマンドで使用される等価演算子。両方のオペランドが等しい場合、true を返します。
string1 == string2 等価演算子は [[ コマンドで使用され、両方のオペランドが等しい場合に true を返します。
string1 != string2 2つのオペランドが等しくない場合に true を返す不等号演算子です。
string1 =~ regex string1 が拡張された regex にマッチした場合に true を返す Regex 演算子。
string1 > string2 string1string2 よりも大きい場合に true を返す、より大きい演算子。
string1 < string2 string1string2 よりも小さい場合に true を返す、小なり演算子。
-z string string の長さが 0 ならば true を返します。
-n string string の長さが 0 でなければ true を返します。
String1="Hello World!!"
String2="Hello World!!"

String3="Delft Stack"

if [ "$String1" = "$String2" ]; then
    echo "String1 and String2 are equal."
else
    echo "String1 and String2 are not equal."
fi

if [[ "$String1" == "$String2" ]]; then
    echo "String1 and String2 are equal."
else
    echo "String1 and String2 are not equal."
fi

if [[ "$String1" != "$String3" ]]; then
    echo "String1 and String3 are not equal."
else
    echo "String1 and String3 are equal."
fi

出力:

String1 and String2 are equal.
String1 and String2 are equal.
String1 and String3 are not equal.

ここで、まず = 演算子を用いて String1String2 を比較します。String1String2 は同じ文字列で同じ長さなので、比較演算子は true を返し、プログラムの最初の if-else ブロックの出力として String1 と String2 は等しいを得ます。

同様に、2 番目のプログラムでは、String1String2== 演算子を用いて比較しています。この場合、比較には [[] を使用する必要があります。

最後に、 != 演算子を使用して String1String3 を比較します。

Bash の辞書式比較

辞書式比較とは、アルファベット順で文字列を比較することです。辞書式比較では、 > および < 演算子を使用します。

name1="Kamal"
name2="Abinash"

if [[ "$name1" > "$name2" ]]; then
    echo "${name1} is greater then ${name2}."
elif [[ "$name1" < "$name2" ]]; then
    echo "${name2} is greater than ${name1}."
else
    echo "Both the namees are equal"
fi

出力:

Kamal is greater then Abinash.

このプログラムでは、name1name2 を辞書的に比較しています。アルファベット順では KA の後に来るので、KA よりも高い値を持ちます。"$name1" > "$name2"true を返し、出力として Kamal is greater then Abinash. を取得します。

文字列が空かどうかを調べる

文字列が空かどうかを調べるには -n-z 演算子を用います。

String=""
if [[ -z $String ]]; then
  echo "The variable String is an empty string."
fi

出力:

The variable String is an empty string.

このプログラムでは、String は空の変数です。演算子 -zstring の長さが 0 の場合に true を返し、したがって、指定されたプログラムからの出力として The variable String is an empty string. を取得します。

String="Test"
if [[ -n $String ]]; then
  echo "The variable String is not an empty string."
fi

出力:

The variable String is not an empty string.

このプログラムでは、String は空の変数ではありません。演算子 -nstring の長さが 0 でなければ true を返し、したがって、指定されたプログラムからの出力として The variable String is not an empty string. が返されます。

文字列にサブストリングが含まれているかどうかを調べる

文字列に部分文字列が含まれているかどうかを調べるには、=~ (Rgex)演算子を用いることができます。

regex 演算子は、string が拡張された regex 式にマッチすれば true を返します。比較のために適切な regex 式を作成しなければならません。

String='My name is Delft.'
if [[ $String =~ .*Delft.* ]]; then
  echo "The given string has Delft on it."
fi

出力:

The given string has Delft on it.

ここで、.*Delft.* はマッチさせる regex 式であり、Delft. の前後にある 0 文字以上の文字列にマッチします。これは文字列の中に Delft の部分文字列が含まれているかどうかをチェックします。

与えられた文字列の中に Delft が存在すれば、与えられた条件が満たされ、出力として The given string has Delft on it. が得られます。

著者: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn