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スクリプトの条件分岐を効果的に使用できるようになります。