Bashスクリプトで文字列を比較する場面は非常に多く、if文による条件分岐の中心的な技術です。本記事では、bash 文字列 比較の基本から応用まで12のテクニックを実例コードとともに解説します。
| 比較方法 | 構文 | 用途 |
|---|---|---|
| 等値比較 | [ "$a" = "$b" ] | 2文字列が一致するか |
| 不一致 | [ "$a" != "$b" ] | 2文字列が異なるか |
| 空文字判定 | [ -z "$a" ] | 文字列が空か |
| 非空判定 | [ -n "$a" ] | 文字列が空でないか |
| パターンマッチ | [[ "$a" == *pat* ]] | ワイルドカード一致 |
| 正規表現 | [[ "$a" =~ ^regex ]] | 正規表現マッチ |
- bash 文字列が等しいか確認する(= と ==)
- bash 文字列が等しくない場合の条件分岐(!=)
- bash 文字列の長さが同じか確認する(${#str})
- bash 文字列が空かどうかを判定する(-z)
- bash 文字列が空でないことを確認する(-n)
- bash ワイルドカードでパターンマッチする([[ == *pattern* ]])
- bash 大文字小文字を無視して文字列を比較する
- bash 文字列の長さを比べてどちらが長いか確認する
- bash 文字列に部分一致する値が含まれるか確認する
- bash 正規表現で文字列を比較する(=~ 演算子)
- 文字列比較を関数化して再利用する
- awk・sed など外部コマンドで文字列パターンを検証する
- 関連記事
- よくある質問(FAQ)
- 関連記事
bash 文字列が等しいか確認する(= と ==)
最も基本的な文字列比較として、2つの文字列が等しいかどうかを確認する方法です。[ ]では =、[[ ]]では == が使えます。
if [ "$str1" = "$str2" ]; then
echo "Strings are equal"
fi
# [[ ]] では == も使える(Bash推奨)
if [[ "$str1" == "$str2" ]]; then
echo "Strings are equal"
fi
bash 文字列が等しくない場合の条件分岐(!=)
2つの文字列が等しくないことを確認する場合には!=演算子を使用します。
if [ "$str1" != "$str2" ]; then
echo "Strings are not equal"
fi
bash 文字列の長さが同じか確認する(${#str})
${#変数名} で文字列の長さを取得し、数値比較演算子 -eq と組み合わせると長さを比べられます。
if [ "${#str1}" -eq "${#str2}" ]; then
echo "Strings are the same length"
fi
bash 文字列が空かどうかを判定する(-z)
文字列が空かどうかは、-zを使用して確認できます。変数が未定義または空文字列のときに真になります。
if [ -z "$str" ]; then
echo "String is empty"
fi
bash 文字列が空でないことを確認する(-n)
逆に、文字列が空でないことを確認するには、-nを使用します。変数に1文字以上ある場合に真になります。
if [ -n "$str" ]; then
echo "String is not empty"
fi
bash ワイルドカードでパターンマッチする([[ == *pattern* ]])
[[ ]] を使うと、ワイルドカード(グロブ)で部分一致を確認できます。*は任意の文字列を表します。
if [[ "$str" == *"pattern"* ]]; then
echo "String contains pattern"
fi
ワイルドカードと正規表現の使い分けをより詳しく知りたい場合は、パターン・正規表現の使い分け|[[ ]] / extglob / grep -Eも参考にしてください。
bash 大文字小文字を無視して文字列を比較する
標準の=/!=では大文字小文字を区別します。ケースインセンシティブな比較には、一度小文字に変換してから比べます。
str1_lower=$(echo "$str1" | tr '[:upper:]' '[:lower:]')
str2_lower=$(echo "$str2" | tr '[:upper:]' '[:lower:]')
if [ "$str1_lower" = "$str2_lower" ]; then
echo "Strings are equal (case insensitive)"
fi
bash 文字列の長さを比べてどちらが長いか確認する
文字列の長さを数値比較することで、どちらが長いかを判定できます。
if [ "${#str1}" -gt "${#str2}" ]; then
echo "str1 is longer than str2"
fi
bash 文字列に部分一致する値が含まれるか確認する
特定の文字列が他の文字列に含まれているかを確認するには、[[ ]] のワイルドカードマッチや grep、case 文を使います。
# [[ ]] で部分一致(推奨)
if [[ "$str" == *"substring"* ]]; then
echo "String contains the substring"
fi
# grep を使う方法
if echo "$str" | grep -q "substring"; then
echo "String contains the substring"
fi
bash 正規表現で文字列を比較する(=~ 演算子)
[[ ]] の =~ 演算子を使うと、正規表現によるマッチングが可能になります。メールアドレスや数字パターンの検証に便利です。
if [[ "$str" =~ ^[0-9]+$ ]]; then
echo "String is a number"
fi
if [[ "$email" =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ ]]; then
echo "Valid email format"
fi
文字列比較を関数化して再利用する
同じ文字列比較を複数回行う場合、関数として定義しておくと効率的です。
compare_strings() {
if [ "$1" = "$2" ]; then
echo "Strings are equal"
else
echo "Strings are not equal"
fi
}
compare_strings "hello" "world"
awk・sed など外部コマンドで文字列パターンを検証する
複雑なパターン検証には awk や sed などの外部コマンドも活用できます。
if echo "$str" | awk '/pattern/{exit 0} {exit 1}'; then
echo "String contains the pattern (using awk)"
fi
これらのテクニックを駆使して、Bashスクリプトの文字列比較をより効果的に行えるようになりましょう。どの手法も、それぞれの利点と用途があり、シナリオに応じて使い分けることが大切です。
関連記事
- クォート戦略と文字列安全化|ダブルクォート前提の指針(変数展開時の意図しない単語分割・グロブ展開を防ぐ書き方)
- シェルスクリプト入門 – 現場で使える実践付きの完全版(if文・ループなど文字列比較を使う基礎から体系的に学べます)
- case/esac徹底解説|ifとの使い分け・パターン設計・落とし穴回避(複数の文字列パターンを分岐させたい場合の代替手段)
よくある質問(FAQ)
[ ](test コマンド)は POSIX 互換で移植性が高く、[[ ]] は Bash 専用の拡張構文です。[[ ]] ではワイルドカードパターン(== 右辺に *)や正規表現マッチ(=~)が使え、変数展開によるグロブ誤動作も起きないため、Bash スクリプトでは [[ ]] の使用が推奨されます。
[ ] 内では POSIX 規格により = が正式です。[[ ]] 内では = も == も同じ意味で動作しますが、可読性のために == が好まれる場合が多いです。移植性を考えると = に統一するのが無難です。
[ -z "$var" ] で空文字列(長さ0)を判定できます。逆に空でないことは [ -n "$var" ] で確認します。変数が未定義の場合も -z は真になるため、「未セットまたは空」を一括で判定できます。
tr '[:upper:]' '[:lower:]' で小文字に変換してから比較するのが汎用的な方法です。Bash 4.0 以降では ${var,,} という変数展開(全小文字化)も使えます:if [[ "${str1,,}" = "${str2,,}" ]]; then

コメント