bashの文字列比較の基本|if文での安全な書き方と注意点

分岐・反復

bashで文字列を比較したいだけなのに、エラーが出たり、思った通りに分岐しなかった経験はありませんか。
多くの場合、その原因は「文字列比較」と「数値比較」を混同していること、そして [ ][[ ]] の違いを正確に理解していないことにあります。

bashの文字列比較は一見シンプルですが、安全に書くためのルールがあります。
これを知らないまま書くと、スペースを含む値や未定義変数でスクリプトが壊れがちです。

ここでは、bash 文字列 比較の基本ルールから、安全に使える書き方、初心者がつまずきやすいポイントまでを、最短で理解できるように整理して解説します。
読み終える頃には、「迷ったらこの書き方」と判断できる状態になります。

bashで文字列を比較する基本ルール

bashでは、文字列比較と数値比較は完全に別物として扱われます。
見た目が似ているため混同されがちですが、使う演算子も評価の仕組みも異なります。

文字列を比較する場合、基本は if 文を使い、
[ ] または [[ ]] の中で条件式を書きます。
ここで重要なのは、「bashは状況に応じて安全度が変わる」という点です。

初心者が最初につまずくのは、次のようなケースです。

  • 数値比較用の -eq を文字列に使ってしまう
  • 変数をクォートせず、スペースを含んだ瞬間にエラーになる
  • 未定義変数を比較して、意図しない結果になる

これらはすべて、文字列比較の基本ルールを知らないことが原因です。

bashでは
「文字列は文字列用の演算子で比較する」
「変数は常に安全側に倒す」
この2点を守るだけで、多くのトラブルを避けられます。

次に、実際に使われる [ ][[ ]] の違いと、
なぜ [[ ]] が推奨されるのかを整理していきます。

bash 文字列 比較の基本構文([ ] と [[ ]])

bashの文字列比較は、if 文の条件部分で [ ][[ ]] を使うのが基本です。
どちらも「条件を評価する枠」ですが、性質がかなり違います。

結論として、bashでは [[ ]] のほうが安全に書きやすいため、迷ったらこちらを選ぶのが無難です。
とくに「スペースを含む値」「未定義変数」「パターンマッチ」のような場面で差が出ます。

[ ] を使った文字列比較の書き方と制約

[ ]test コマンドと同じ扱いで、古くからある書き方です。
文字列が等しいかは = を使って判定します。

if [ "$a" = "$b" ]; then
  echo "same"
fi

ここで大事なのは、変数は基本クォートすることです。
クォートしないと、空文字やスペースを含む値で引数が崩れ、[: missing ] のようなエラーや誤判定につながります。

# 危険($a が空、または "a b" のようにスペースを含むと壊れやすい)
if [ $a = $b ]; then
  :
fi

また、[ ] は演算子や記号の解釈が素直すぎて、書き方の自由度が低いのも弱点です。
「安全第一」で書くなら、クォート前提で使う必要があります。

[[ ]] を使った文字列比較の安全な書き方

[[ ]] はbashの拡張で、条件式をより安全に評価できる構文です。
文字列比較では == がよく使われます(= も使えます)。

if [[ "$a" == "$b" ]]; then
  echo "same"
fi

[[ ]] が推奨されやすい理由は、現場でハマりやすいポイントに強いからです。

  • 変数をクォートしておけば、スペースを含んでも壊れにくい
  • == で直感的に読める(等価判定だと一目で分かる)
  • 条件式として扱うため、[ ] より事故が起きにくい

そして、bashの文字列比較で頻出の「空文字チェック」「未定義っぽい値の扱い」も、[[ ]] を軸にすると整理しやすくなります。

次は、実際に使う演算子を「実務で必要なものだけ」に絞って一覧化します。

bash 文字列 比較で使う演算子一覧と意味

bashの文字列比較で使う演算子は、全部を覚える必要はありません。
実務で頻出なのは 「一致・不一致」 と 「空・非空」 の4つです。ここだけ押さえれば十分回ります。

やりたいこと例(推奨: [[ ]]意味
等しいか[[ "$a" == "$b" ]]2つの文字列が一致
等しくないか[[ "$a" != "$b" ]]2つの文字列が不一致
空か(長さ0)[[ -z "$a" ]]$a が空文字なら真
空ではないか[[ -n "$a" ]]$a が1文字以上なら真

特に -z / -n は「空文字チェック専用」 として覚えると混乱しません。
[[ "$a" == "" ]] のようにも書けますが、意図が読み取りづらくなりやすいので、空チェックは -z / -n を使うほうが保守しやすいです。

また、等価比較は迷ったらこの形に寄せるのが安全です。

if [[ "$a" == "$b" ]]; then
  :
fi

bashの文字列比較で事故が起きる典型は、ここまでの演算子の問題というより、次の「数値比較との混同」です。
次は ==-eq を混ぜると何が起きるのか、違いを一気に整理します。

bashの文字列比較と数値比較の決定的な違い

bashでは、文字列比較と数値比較は見た目が似ていても中身がまったく違います。
ここを混同すると、エラーが出たり、条件分岐が意図せず通ってしまいます。

結論から言うと、

  • 文字列比較:== / != を使う
  • 数値比較:-eq / -ne / -lt などを使う

この使い分けは必須です。

文字列比較の正しい例

文字列として同じかどうかを見たい場合は、次のように書きます。

if [[ "$a" == "10" ]]; then
  echo "string"
fi

ここでは "10" はあくまで文字列です。
"10""010" は別物として扱われます。

数値比較で使うべき構文(注意点)

一方、数として比較したい場合は数値用の演算子を使います。

if [[ "$a" -eq 10 ]]; then
  echo "number"
fi

ここで $a が数値でない場合、エラーになります。
つまり 数値比較は「数であること」が前提です。

初心者がやりがちなのが、次のような書き方です。

# 誤り
if [[ "$a" == 10 ]]; then
  :
fi

これはエラーにはなりませんが、文字列として比較されるため、
「数値として同じか」を判定したい場面では意図とズレます。

bashでは
「これは文字として見たいのか、数として見たいのか」
を先に決めてから演算子を選ぶのが正解です。

次は、実際の現場でよく起きるミスと、その避け方を整理します。

bash 文字列 比較でよくあるミスと対処法

bashの文字列比較は、書き方を少し間違えるだけで挙動が不安定になります。
ここでは、初心者が特につまずきやすいポイントと、その回避策を整理します。

まず多いのが、変数をクォートしないミスです。

# 危険
if [[ $a == $b ]]; then
  :
fi

$a$b にスペースや空文字が入ると、条件式が崩れやすくなります。
基本は次の形を癖にするのが安全です。

if [[ "$a" == "$b" ]]; then
  :
fi

次に、スペースを含む文字列の落とし穴です。
設定値や引数には、意外とスペースが含まれます。[[ ]] を使い、必ずクォートすれば回避できます。

また、大文字・小文字の扱いも混乱しやすい点です。
bashの文字列比較はデフォルトで区別します。

[[ "Test" == "test" ]]  # 偽

区別したくない場合は、比較前に小文字へ揃えるなど、事前処理で対応するのが基本です。

bashの文字列比較で困ったら、
「クォートしているか」「文字列として比べているか」
この2点を見直すだけで、ほとんどの問題は解消できます。

次は、実務でよく使われる具体的な比較パターンを見ていきます。

bash 文字列 比較の実務で使える具体例

ここまでのルールを踏まえると、bashの文字列比較は実務ではかなりシンプルに書けます。
代表的な使いどころをいくつか見ておくと、応用が利きやすくなります。

まず多いのが、引数による処理分岐です。

if [[ "$1" == "start" ]]; then
  echo "start mode"
elif [[ "$1" == "stop" ]]; then
  echo "stop mode"
fi

引数は空になることもあるため、[[ ]] とクォートの組み合わせが安全です。

次に、設定値や環境変数による条件分岐です。

if [[ "$ENV" == "production" ]]; then
  echo "prod"
else
  echo "dev"
fi

環境変数は未定義の可能性があるため、文字列比較として扱うのが無難です。

実務では、比較ロジックを増やしすぎないことも重要です。
条件が増えるほど、読みづらくなり、修正時の事故が増えます。

bashの文字列比較は
[[ "$a" == "value" ]] を軸に、分岐は最小限」
この形を守るだけで、保守性は大きく下がりません。

最後に、ここまでの内容を一言でまとめます。

結論|bashで文字列比較を書くときの最適解

bashで文字列比較を書くなら、基本の最適解はこれです。

[[ "$a" == "$b" ]]

この形が強い理由は、安全性を最優先できるからです。
変数が空でも、スペースを含んでも壊れにくく、条件式が読みやすい形に揃います。

迷ったときの判断基準はシンプルです。

  • 文字として比べたい → == / !=[[ ]] を使う)
  • 空かどうかを見たい → -z / -n
  • 数として比べたい → -eq など(文字列比較とは別枠)

bashの文字列比較でつまずく原因のほとんどは、演算子そのものよりも
「比較の種類の混同」と「クォート不足」です。

まずは [[ "$a" == "$b" ]] を型として覚え、
必要に応じて -z / -n、数値比較へ分岐させるのが、最短で安定する書き方です。

まとめ

bashで文字列を比較するときは、「文字列として比べる」ことを明確に意識するのが最重要です。
数値比較と混同せず、構文と演算子を正しく選ぶだけで、不要なエラーや誤判定は大きく減らせます。

基本の判断軸はとてもシンプルです。

  • 文字列の一致・不一致は [[ "$a" == "$b" ]] を基準形にする
  • 空かどうかの判定は -z / -n を使う
  • 数として扱いたい場合は、文字列比較とは切り離して数値比較を行う

特に初心者のうちは、[[ ]] とクォートを前提に書くだけで安全性が一気に上がります。
複雑な書き方を覚えるよりも、「迷ったらこの形」と決めておくことが、保守しやすいスクリプトへの近道です。

bashの文字列比較は難しいものではありません。
正しい型を身につければ、条件分岐は安定し、スクリプト全体の見通しも良くなります。

Bash玄

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

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

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

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

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

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

Bash玄をフォローする