HOWTO · Bash
Bash 変数が空かどうかを確認する方法
安全な引用の仕方や、未設定の値と空白のみの値の動作を含め、変数が空文字列かどうかをテストする Bash の 4 つの方法を学びます。
このページの内容
提供された Bash の値については、その展開を引用することで、シェルがそれを 1 つの引数として渡すようにします。このスクリプトはラベル付きの値を出力します。
value='Bash'
if [ -z "$value" ]; then
printf '%s\n' 'No value supplied'
else
printf 'Value: %s\n' "$value"
fi
Value: Bash
test コマンド([ ... ] とも書かれます)は、展開された文字列が 0 文字の場合に成功を返します。未設定の変数は通常の Bash シェルでは空文字列に展開されるため、-z は未設定の値と明示的に空の値を同様に扱います。set -u を使用する場合は、テストの前にデフォルト値を提供するために ${value-} を使用してください。0 のような値や空白だけの文字列は空ではありません。このテストは文字をチェックするものであり、単語が真らしいかどうかをチェックするものではありません。
-z で Bash 変数が空かどうかを確認する
test コマンド([ ... ] とも書かれます)は、展開された文字列が 0 文字の場合に成功ステータスを返します。0 以外のステータスは、少なくとも 1 文字が含まれていることを意味します。テスト自体はメッセージを出力しません。どのコマンドを実行するかは if 文が選択します。
value=''
if [ -z "$value" ]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is empty
未設定の変数については、通常のシェル構成では同じ引用付きチェックが成功します。set -u を使用する場合は、展開が定義されたままになるよう、代わりに [ -z "${value-}" ] と書いてください。角括弧コマンドはシェルコマンドであり、その成功または失敗は終了ステータスで表されます。自動的に true や false を出力することはありません。
-n で Bash 変数が空でないことを確認する
補完的なテストには -n を使用します。これは、展開された文字列に少なくとも 1 文字が含まれている場合に成功を返します。then ブランチは空でない値に対して実行され、else は、値が空の場合も含め、テストが失敗したときに実行されます。
value='Bash'
if [ -n "$value" ]; then
printf '%s\n' 'value is not empty'
else
printf '%s\n' 'value is empty'
fi
value is not empty
引用が重要なのは、展開を 1 つの引数として保持するためです。-z の場合と同様に、スクリプトが set -u で実行され、変数が未設定の可能性がある場合は、引用符の中で ${value-} を使用してください。-n オプションは、次のアクションが値が提供された後にのみ行われるべき場合に特に読みやすくなります。
Bash 変数を空文字列と比較する
Bash の [[ ... ]] 条件式を使用して、値を空文字列と直接比較できます。引用された展開により意図が明確になり、空白を含む文字列は、その空白が文字であるため、依然として空ではありません。
value=' '
if [[ "$value" == "" ]]; then
printf '%s\n' 'value is empty'
else
printf '%s\n' 'value is not empty'
fi
value is not empty
この例では 2 番目のブランチを取ります。空白は [[ ... ]] の中では消えません。set -u を使用するスクリプトでは、${value-} を比較し、未設定の変数を空文字列として扱うようにしてください。
${parameter:+word} パラメータ展開で変数を確認する
${parameter:+word} 形式は、パラメータが設定されており、かつ null でない場合に word に展開されます。パラメータが未設定の場合、または空文字列を含んでいる場合は、何にも展開されません。展開を引用しながらテストしてください。
value='Bash'
if [ "${value:+present}" ]; then
printf '%s\n' 'value is set and nonempty'
else
printf '%s\n' 'value is unset or empty'
fi
value is set and nonempty
このイディオムは、必要な区別が「設定されていて空でない」対「未設定または空」である場合に役立ちます。後者の 2 つの状態は区別しません。未設定のパラメータと、設定されているが空のパラメータを区別するには、Bash の [[ -v value ]] チェックを別のテストとして使用してください。