Bash で文字列を比較する方法
様々な比較演算子を使って文字列を比較し、正規表現を使って文字列に部分文字列が含まれているかどうかを調べます。
Bash での文字列比較
文字列比較とは、与えられた文字列が同じかどうかを調べることです。2つ以上の文字列が同じ長さで、同じ文字列を含んでいれば同じです。
条件に応じて真または偽を返す様々な文字列比較演算子を使用します。広く使われている文字列比較演算子には、以下のようなものがあります。
string1 = string2 |
[ コマンドで使用される等価演算子。両方のオペランドが等しい場合、true を返します。 |
string1 == string2 |
等価演算子は [[ コマンドで使用され、両方のオペランドが等しい場合に true を返します。 |
string1 != string2 |
2つのオペランドが等しくない場合に true を返す不等号演算子です。 |
string1 =~ regex |
string1 が拡張された regex にマッチした場合に true を返す Regex 演算子。 |
string1 > string2 |
string1 が string2 よりも大きい場合に true を返す、より大きい演算子。 |
string1 < string2 |
string1 が string2 よりも小さい場合に 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.
ここで、まず = 演算子を用いて String1 と String2 を比較します。String1 と String2 は同じ文字列で同じ長さなので、比較演算子は true を返し、プログラムの最初の if-else ブロックの出力として String1 と String2 は等しいを得ます。
同様に、2 番目のプログラムでは、String1 と String2 を == 演算子を用いて比較しています。この場合、比較には [[] を使用する必要があります。
最後に、 != 演算子を使用して String1 と String3 を比較します。
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.
このプログラムでは、name1 と name2 を辞書的に比較しています。アルファベット順では K が A の後に来るので、K は A よりも高い値を持ちます。"$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 は空の変数です。演算子 -z は string の長さが 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 は空の変数ではありません。演算子 -n は string の長さが 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 is a backend software engineer at Matrice.ai.
LinkedIn