HOWTO · Bash
Bash でブール値を宣言して利用する
このチュートリアルでは、Bash でのブール値の宣言と使用法について説明します。
このページの内容
Bashには専用のブール型変数はありません。選択状態を表すには、コマンドの成功・失敗ステータスをそのまま使うか、1を有効、0を無効とするような値の規約を決めます。この2つは別の概念です。コマンドのステータスは0が成功、0以外が失敗を意味します。以下の例では、変数の中身をコマンドとして実行せずに、両方の方法を使う手順を示します。
Bashのブール値と終了ステータス
trueコマンドとfalseコマンドは、それぞれ成功と失敗を示します。if文が評価するのはコマンドのステータスです。これらはコマンドであり、変数に格納される特別な値ではありません。値を保存したり引数として渡したりする必要がある場合は、規約を明記した整数フラグを使うこともできます。
条件式でtrueとfalseを使う
成功するか失敗するかを調べたい場合は、コマンドを条件として直接使います。これにより、Bashはコマンドの終了ステータスに応じて分岐できます。
このセクションのコードと表示されるラベルや出力は英語のままです。
if true; then
printf '%s\n' 'The command succeeded.'
fi
if false; then
printf '%s\n' 'This branch is skipped.'
else
printf '%s\n' 'The command reported failure.'
fi
変数を調べるためにif $value; thenと書くのは避けてください。Bashは変数の内容をコマンドとして実行しようとします。既知の値と比較するか、テスト式を使ってください。
変数でブール値に相当する状態を表す
整数フラグはアプリケーション側で決める規約なので、値と意味の対応を選び、明記してください。この例では1を有効、0を無効として扱います。算術条件では数値として比較するため、コマンドのステータスと混同しません。
このBashの例を実行すると、有効フラグを数値で判定し、関数に渡し、ループの出力を制御する方法を確認できます。
このセクションのコードと表示されるラベルや出力は英語のままです。
enabled=1
if (( enabled == 1 )); then
printf '%s\n' 'Feature is enabled.'
else
printf '%s\n' 'Feature is disabled.'
fi
report_feature() {
local flag=$1
if (( flag == 1 )); then
printf '%s\n' 'Function received an enabled flag.'
else
printf '%s\n' 'Function received a disabled flag.'
fi
}
report_feature "$enabled"
for item in alpha beta; do
if (( enabled == 1 )); then
printf 'Processing %s.\n' "$item"
fi
done
Feature is enabled.
Function received an enabled flag.
Processing alpha.
Processing beta.
ファイルを調べるときは、目的に合ったテスト式を使ってください。[テストでは展開結果が未設定だったり空白を含んだりしても引数が変わらないよう、変数展開を引用符で囲みます。Bash固有の条件には[[ ... ]]または算術構文を使います。
論理演算子で条件を組み合わせる
&&は左側のコマンドが成功した場合に限り、右側のコマンドを実行します。||は左側が失敗した場合に右側を実行します。どちらの演算子も、0を成功とするコマンドのステータスに基づいて動作します。意図した条件のまとまりが読み取りにくくなる場合は、括弧を使うか、if文を分けてください。
このセクションのコードと表示されるラベルや出力は英語のままです。
is_logged_in=1
is_admin=0
if (( is_logged_in == 1 && is_admin == 1 )); then
printf '%s\n' 'Access granted.'
else
printf '%s\n' 'Access denied.'
fi
config_file=/etc/example.conf
if [[ -f "$config_file" ]] && printf '%s\n' 'Configuration file exists.'; then
:
fi
最初の条件は2つの整数フラグを組み合わせています。2つ目の条件はメッセージを表示する前にファイルを確認します。[[ -f ... ]]はBashの条件式であり、ブール値の変数を生成するコマンドではありません。
関数とループでフラグを使う
明示的に定義したフラグは、引用符で囲んで関数の引数として渡し、同じ規約に従って比較します。ループでは、その状態を読み取ったり更新したりして、続行するかどうかを決められます。無限に続かないよう、ループの停止条件を明確にしてください。
このセクションのコードと表示されるラベルや出力は英語のままです。
keep_running=1
step=0
while (( keep_running == 1 )); do
(( step += 1 ))
printf 'Step %d.\n' "$step"
if (( step >= 3 )); then
keep_running=0
fi
done
算術コマンドは、式の値に応じたステータスを返します。ここでは増分が正の値で、ループ条件はカウンターが3に達した後に終了するよう保存済みのフラグを使います。
Bashでよくあるブール値の誤り
- Bashでは
0がtrue、1がfalseだと決めつけないでください。この対応は自分で定める規約です。シェルのコマンドステータスでは、0が成功、0以外が失敗を表します。 - 変数がtrueかどうかを調べるために、任意の変数をコマンドとして展開しないでください。値を比較するか、条件式を使います。
- 単一角括弧のテストでは、
[ "$name" = "ready" ]のように変数展開を引用符で囲みます。数値の場合は(( number == 1 ))を使うか、数値テストのオペランドを引用符で囲みます。 &&と||が判断するのはコマンドの成功・失敗です。変数に格納されたtrueやfalseといった語ではありません。
フラグの規約を1つ選び、代入と比較の両方で一貫して使ってください。操作が成功したかを調べるときは、コマンドのステータスを使います。