Bashでの文字列比較方法:条件分岐で使える便利なテクニック12選

スクリプト設計
スクリプト設計

Bashスクリプトで文字列を比較する場面は非常に多く、if文による条件分岐の中心的な技術です。本記事では、bash 文字列 比較の基本から応用まで12のテクニックを実例コードとともに解説します。

比較方法構文用途
等値比較[ "$a" = "$b" ]2文字列が一致するか
不一致[ "$a" != "$b" ]2文字列が異なるか
空文字判定[ -z "$a" ]文字列が空か
非空判定[ -n "$a" ]文字列が空でないか
パターンマッチ[[ "$a" == *pat* ]]ワイルドカード一致
正規表現[[ "$a" =~ ^regex ]]正規表現マッチ

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 文字列に部分一致する値が含まれるか確認する

特定の文字列が他の文字列に含まれているかを確認するには、[[ ]] のワイルドカードマッチや grepcase 文を使います。

# [[ ]] で部分一致(推奨)
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 など外部コマンドで文字列パターンを検証する

複雑なパターン検証には awksed などの外部コマンドも活用できます。

if echo "$str" | awk '/pattern/{exit 0} {exit 1}'; then
    echo "String contains the pattern (using awk)"
fi

これらのテクニックを駆使して、Bashスクリプトの文字列比較をより効果的に行えるようになりましょう。どの手法も、それぞれの利点と用途があり、シナリオに応じて使い分けることが大切です。

関連記事

よくある質問(FAQ)

bash で文字列比較するとき [ ] と [[ ]] の違いは何ですか?

[ ](test コマンド)は POSIX 互換で移植性が高く、[[ ]] は Bash 専用の拡張構文です。[[ ]] ではワイルドカードパターン(== 右辺に *)や正規表現マッチ(=~)が使え、変数展開によるグロブ誤動作も起きないため、Bash スクリプトでは [[ ]] の使用が推奨されます。

bash で文字列比較に = と == どちらを使えばいいですか?

[ ] 内では POSIX 規格により = が正式です。[[ ]] 内では === も同じ意味で動作しますが、可読性のために == が好まれる場合が多いです。移植性を考えると = に統一するのが無難です。

bash で変数が空かどうかを判定するには?

[ -z "$var" ] で空文字列(長さ0)を判定できます。逆に空でないことは [ -n "$var" ] で確認します。変数が未定義の場合も -z は真になるため、「未セットまたは空」を一括で判定できます。

bash で大文字小文字を区別せずに文字列比較するには?

tr '[:upper:]' '[:lower:]' で小文字に変換してから比較するのが汎用的な方法です。Bash 4.0 以降では ${var,,} という変数展開(全小文字化)も使えます:if [[ "${str1,,}" = "${str2,,}" ]]; then

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント