bashで文字列を比較する方法はいくつかあります。本記事では、その中の主な方法について解説します。
等価比較(=, ==)
bashでは文字列が等しいかどうかを比較するために「=」または「==」演算子を使用します。シングルブラケット「[ ]」(条件評価をする基本コマンド)とダブルブラケット「[[ ]]」(bashの拡張機能で、より柔軟な条件評価が可能)のどちらでも使えますが、ダブルブラケットの方が安全でおすすめです。
例
文字列が等しいかどうかを確認するもっとも基本的な方法です。シングルブラケットとダブルブラケットの両方の例を示します。
# 直接文字列を比較
if [ "hello" = "hello" ]; then
echo "文字列は等しい"
fi
# 変数と文字列を比較
text="hello"
if [ "$text" = "hello" ]; then
echo "文字列は等しい"
fi
# ダブルブラケットを使った例
if [[ "hello" == "hello" ]]; then
echo "文字列は等しい"
fi
非等価比較(!=)
文字列が等しくないことを確認するには「!=」演算子を使います。
例
文字列が異なることを確認する方法です。等価比較の逆の結果を返します。
if [ "$a" != "$b" ]; then
echo "文字列は等しくない"
fi
# ダブルブラケットを使った例
if [[ "$a" != "$b" ]]; then
echo "文字列は等しくない"
fi
空文字列チェック(-z)
文字列が空かどうかを確認するには「-z」演算子を使用します。
例
変数が空(長さゼロ)かどうかを確認します。空の場合は条件が真になります。
if [ -z "$text" ]; then
echo "文字列は空です"
fi
# ダブルブラケットを使った例
if [[ -z "$text" ]]; then
echo "文字列は空です"
fi
非空文字列チェック(-n)
文字列が空でないことを確認するには「-n」演算子を使用します。
例
変数に何らかの値が含まれているかどうかを確認します。空でない場合は条件が真になります。
if [ -n "$text" ]; then
echo "文字列は空ではありません"
fi
# ダブルブラケットを使った例
if [[ -n "$text" ]]; then
echo "文字列は空ではありません"
fi
パターンマッチング
bashではワイルドカードや正規表現を使ったパターンマッチングも可能です。これはダブルブラケット「[[ ]]」を使用する必要があります。
ワイルドカードを使った例
アスタリスク(*)やクエスチョンマーク(?)などのワイルドカードを使って、文字列が特定のパターンに一致するかを調べます。
if [[ "$string" == *abc* ]]; then
echo "文字列に「abc」が含まれています"
fi
if [[ "$string" == abc* ]]; then
echo "文字列は「abc」で始まります"
fi
if [[ "$string" == *abc ]]; then
echo "文字列は「abc」で終わります"
fi
正規表現を使った例
=~演算子を使用して、より複雑なパターンマッチングを行います。正規表現の強力な機能を活用できます。
if [[ "$string" =~ ^[0-9]+$ ]]; then
echo "文字列は数字のみで構成されています"
fi
if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$ ]]; then
echo "有効なメールアドレス形式です"
fi
case文での文字列比較
複数のパターンと比較する場合はcase文が便利です。
例
複数の条件に対して分岐処理を行う場合、if-elifの連続よりもcase文の方が読みやすく効率的です。
case "$fruit" in
"apple")
echo "これはリンゴです"
;;
"orange"|"mandarin")
echo "これはオレンジ類です"
;;
"banana")
echo "これはバナナです"
;;
*)
echo "不明な果物です"
;;
esac
文字列長の比較
文字列の長さを取得して比較することもできます。
例
${#string}構文を使って文字列の長さを取得し、その値を数値として比較します。
# 文字列長を取得
length=${#string}
echo "文字列の長さ: $length"
# 長さの比較
if [ ${#string} -gt 10 ]; then
echo "文字列は10文字より長いです"
fi
if [ ${#string} -eq 0 ]; then
echo "文字列は空です"
fi
部分文字列のチェック
文字列に特定の部分文字列が含まれているかをチェックする方法です。
例
文字列内に特定の部分文字列が含まれているかを確認する方法です。ワイルドカードを使った簡潔な方法です。
if [[ "$sentence" == *"keyword"* ]]; then
echo "文字列に「keyword」が含まれています"
fi
注意点
変数の引用
変数は常に二重引用符で囲むことをおすすめします。これにより、変数が空の場合や空白を含む場合のエラーを防げます。
# 良い例
if [ "$var" = "value" ]; then
# 処理
fi
# 悪い例(空白を含む変数でエラーになる可能性あり)
if [ $var = value ]; then
# 処理
fi
ブラケットの違い
- シングルブラケット「[ ]」はPOSIX互換で古いシェルでも動作します
- ダブルブラケット「[[ ]]」はbash固有の拡張機能で、より強力で安全です
ブラケット内の演算子の前後の空白
ブラケット内の演算子の前後には空白が必要です。空白がないとシンタックスエラーになります。
# 正しい書き方
if [ "$a" = "$b" ]; then
# 間違った書き方(エラーになる)
if ["$a"="$b"]; then
大文字小文字の区別
bashでの文字列比較はデフォルトで大文字小文字を区別します。つまり、”Hello”と”hello”は異なる文字列と判断されます。区別したくない場合は、${変数,,}
という記法を使って比較前に両方の文字列を小文字に変換します。これにより、どちらの文字列に大文字が含まれていても同じ小文字形式で比較されるため、大文字小文字の違いを無視できます。
# 大文字小文字を区別しない比較
if [[ "${a,,}" == "${b,,}" ]]; then
echo "大文字小文字を無視して等しい"
fi
まとめ
bashでの文字列比較には様々な方法があります。主な比較方法は以下です。
- 等価比較(=, ==): 文字列が等しいかを確認
- 非等価比較(!=): 文字列が異なるかを確認
- 空文字列チェック(-z): 文字列が空かを確認
- 非空文字列チェック(-n): 文字列が空でないかを確認
- パターンマッチング: ワイルドカードや正規表現を使用
- case文: 複数のパターンとの比較
- 文字列長の比較: 文字列の長さを比較
- 部分文字列のチェック: 特定の部分文字列を含むか確認
基本的には二重括弧「[[ ]]」を使用し、変数は必ず二重引用符で囲むことで、多くのエラーを防ぎ、堅牢なスクリプトが書けます。また、演算子の前後には空白を入れることを忘れないようにしましょう。