HOWTO · Bash

Bash で変数に値があるかどうかを確認する

このチュートリアルでは、Bash で変数に値が含まれているかどうかを確認する方法について説明します。

このページの内容

スクリプトは、処理を実行する前にユーザー入力を検証する必要があることがよくあります。Bashで「値がある」とは、変数に空でない文字列が入っていること、または変数に何らかの値が代入済みであることを意味します。この2つは異なる問いです。未設定の変数も、'' が代入された変数も展開すると空文字列になりますが、設定済みなのは後者だけです。

値があるとはどういうことか

スクリプトがファイル名やユーザーの回答などの内容を必要とする場合は、空でない文字列かどうかを検査します。明示的に渡された空の値と入力の省略とで意味が異なる場合は、設定状態を検査します。演算子を選ぶ前に、どちらの状態を判定したいのかを決めてください。そうしないと、検査自体は正しくても、意図と異なる条件を強制してしまうことがあります。

-z と -n で空文字列か空でない文字列かを調べる

Bashの条件演算子 -z と -n は、文字列の長さを検査します。引用符で囲んだ展開結果が空なら -z が成功し、空でなければ -n が成功します。"$value" のように引用符で囲むと、値に空白やワイルドカード文字が含まれていても、検査に1つの文字列として渡せます。変数名は小文字で統一してください。Bashでは変数名の大文字と小文字が区別されます。

if...else 文で検査結果を使う

次の例を実行します。

このセクションのコードと表示されるラベルや出力は英語のままです。

name="Ada"
if [[ -n "$name" ]]; then
  printf 'Hello, %s\n' "$name"
else
  printf 'Please enter a name.\n'
fi

この名前は代入済みで条件を満たすため、スクリプトは最初の分岐に進みます。条件を満たさない値の場合は else 分岐が処理します。Bashでは [[ ... ]] は条件コマンドです。移植性を考慮した形式の [ ... ] でも、[ -n "$name" ] のように引数を引用符で囲めば -z と -n を検査できます。要件が文字列の長さに関するものなら、== を -z や -n の代わりに使わないでください。

パラメーター展開で未設定の変数を見分ける

変数が設定済みかどうかを調べるには、${value+x} というパラメーター展開を使います。value が空文字列であっても設定済みなら x に展開され、未設定なら何も展開されません。これにより、変数の値と、正当な入力になり得る unset のような番兵値を比較せずに済みます。

このセクションのコードと表示されるラベルや出力は英語のままです。

unset value
if [[ ${value+x} ]]; then
  printf 'The variable is set.\n'
else
  printf 'The variable is unset.\n'
fi

このパラメーター展開は [[ ... ]] の中にあり、文字列として検査されます。もう一方の状態を調べるには、条件の前に value='' を代入します。すると設定状態の検査は最初の分岐に進みますが、[[ -z "$value" ]] も引き続き成功します。この例から、「設定済み」と「空でない」は同じ意味ではないことが分かります。

要件に合った検査方法を選ぶ

空でない文字列が必要な場合は [[ -n "$value" ]] を使い、空文字列を検出する場合は [[ -z "$value" ]] を使います。空文字列への代入も含め、変数に代入があるかどうかを区別したい場合は [[ ${value+x} ]] を使います。否定形の [[ ! -n "$value" ]] でも空文字列を検査できますが、-z のほうが意図を直接表します。

これらの例にはBashの構文が必要で、Bashシェルで実行してください。BashはLinux以外のオペレーティングシステムでも利用できます。スクリプトの入力仕様に合う検査を選び、その結果に応じて目的に合った分岐を処理してください。