Bashのif/elif/else条件分岐の使い方
Bashスクリプトにおける条件分岐は、プログラミングの基本ですが、初心者が陥りやすい構文の違いがあります。特に、比較演算子の使い分けと変数の引用符付けが重要です。
問題点:正しく動作しない条件分岐
以下のようなコードは期待通りに動作しません:
bash
aaa="xxx"
if [[ $aaa -eq "bbb" ]]; then
echo "bbb"
elif [[ $aaa -eq "ccc" ]]; then
echo "ccc"
else
echo "something else"
fi
このコードは常に bbb
を出力してしまいます。その理由は -eq
演算子の誤った使用 にあります。
解決策:適切な比較演算子の選択
文字列比較には ==
または =
を使用
注意
-eq
は数値比較専用の演算子です。文字列比較には使用できません。
正しい文字列比較の構文:
bash
if [[ "$aaa" == "bbb" ]]; then
echo "bbb"
elif [[ "$aaa" == "ccc" ]]; then
echo "ccc"
else
echo "something else"
fi
変数の引用符付け
変数を引用符で囲むことは重要です。これにより、変数が空の場合やスペースを含む場合の予期せぬ動作を防げます。
bash
# 安全な方法:変数を引用符で囲む
if [[ "$aaa" == "bbb" ]]; then
# 危険な方法:引用符がない
if [[ $aaa == "bbb" ]]; then
さまざまな条件分岐の方法
方法1: [[ ]]
を使用した条件分岐(推奨)
bash
#!/bin/bash
aaa="xxx"
if [[ "$aaa" == "bbb" ]]; then
echo "bbb"
elif [[ "$aaa" == "ccc" ]]; then
echo "ccc"
else
echo "something else"
fi
方法2: [ ]
を使用した条件分岐
bash
#!/bin/bash
aaa="$1"
if [ "$aaa" = "bbb" ]; then
echo "bbb"
elif [ "$aaa" = "ccc" ]; then
echo "ccc"
else
echo "something else"
fi
情報
[[ ]]
は [ ]
より高度な機能を提供し、より安全です。Bashスクリプトでは [[ ]]
の使用が推奨されます。
方法3: case
文を使用した条件分岐
複数の条件をチェックする場合、case
文はより簡潔で読みやすいコードになります:
bash
#!/bin/bash
case "$aaa" in
bbb) echo "bbb";;
ccc) echo "ccc";;
*) echo "something else";;
esac
使用例と実践的なコード
ユーザー入力に基づく条件分岐
bash
#!/bin/bash
read -p "値を入力してください: " input_value
if [[ "$input_value" == "start" ]]; then
echo "処理を開始します"
elif [[ "$input_value" == "stop" ]]; then
echo "処理を停止します"
elif [[ "$input_value" == "restart" ]]; then
echo "処理を再開します"
else
echo "不明なコマンド: $input_value"
fi
コマンドの実行結果に基づく条件分岐
bash
#!/bin/bash
# jqコマンドの結果を取得
result=$(jq '.data.result[0].value[1]' readingFromThisfile.out)
if [ "$result" = '"0"' ]; then
echo "結果は0です"
else
echo "結果は0以外です: $result"
fi
よくある間違いと回避策
-eq
の誤用: 文字列比較に数値演算子を使用しない- 引用符の省略: 変数は常に引用符で囲む
- スペースの省略: 条件式内のスペースを忘れない
[ condition ]
まとめ
Bashの条件分岐を正しく使用するための重要なポイント:
- 文字列比較には
==
または=
を使用する - 変数は常に引用符で囲む
"$variable"
- 複数条件には
case
文を検討する [[ ]]
は[ ]
より安全で機能が豊富
これらの基本を押さえることで、Bashスクリプトの条件分岐を効果的に使用できるようになります。