シェルスクリプトでは、状況に応じて処理を切り替える 条件分岐 が非常に重要です。
ここでは 数値や文字列の比較演算 と if文・case文 の使い方を丁寧に解説します。
目次
1. 基本の if 文
#!/bin/bash
number=10
if [ $number -gt 5 ]; then
echo "number は 5 より大きい"
fi
出力:
number は 5 より大きい
ポイント
if [ 条件 ]; then … fiが基本構文[の前後にはスペースが必要fiで if 文を閉じる
2. else / elif を使った分岐
#!/bin/bash
number=3
if [ $number -gt 5 ]; then
echo "number は 5 より大きい"
elif [ $number -eq 5 ]; then
echo "number は 5 です"
else
echo "number は 5 より小さい"
fi
出力:
number は 5 より小さい
elifは「else if」の意味- 最後の
elseはそれ以外の場合の処理
3. 数値比較演算子
| 演算子 | 説明 |
|---|---|
-eq | 等しい |
-ne | 等しくない |
-lt | より小さい |
-le | 以下 |
-gt | より大きい |
-ge | 以上 |
例:
a=10
b=7
if [ $a -ge $b ]; then
echo "a は b 以上"
fi
4. 文字列比較演算子
| 演算子 | 説明 |
|---|---|
= | 等しい |
!= | 等しくない |
-z | 文字列が空 |
-n | 文字列が空でない |
例:
name="Alice"
if [ "$name" = "Alice" ]; then
echo "こんにちは、Aliceさん!"
fi
text=""
if [ -z "$text" ]; then
echo "text は空です"
fi
出力:
こんにちは、Aliceさん!
text は空です
5. 論理演算(AND / OR / NOT)
5-1. AND (-a)
age=25
gender="male"
if [ $age -gt 18 -a "$gender" = "male" ]; then
echo "成人男性です"
fi
5-2. OR (-o)
day="土"
if [ "$day" = "土" -o "$day" = "日" ]; then
echo "週末です"
fi
5-3. NOT (!)
file="/tmp/test.txt"
if [ ! -f "$file" ]; then
echo "ファイルが存在しません"
fi
💡 ポイント
&&,||は[[ ]]内で使うこともできます(bash拡張)
6. 複数条件の書き方([[ ]] 形式)
#!/bin/bash
age=20
gender="female"
if [[ $age -ge 18 && "$gender" = "female" ]]; then
echo "成人女性です"
fi
[[ ]]は[より柔軟で、論理演算子&&/||がそのまま使える- 条件のグループ化も簡単
7. ファイルテスト条件
シェルスクリプトでは、ファイルの存在や種類も条件にできます。
| オプション | 説明 |
|---|---|
-f | ファイルが存在するか |
-d | ディレクトリが存在するか |
-r | 読み取り可能か |
-w | 書き込み可能か |
-x | 実行可能か |
例:
file="/tmp/test.txt"
if [ -f "$file" ]; then
echo "ファイルが存在します"
fi
if [ -d "/tmp" ]; then
echo "/tmp はディレクトリです"
fi
8. case 文による条件分岐
複数の値を比較するときは case が便利です。
#!/bin/bash
day="土"
case "$day" in
月|火|水|木|金)
echo "平日です"
;;
土|日)
echo "週末です"
;;
*)
echo "不明な日です"
;;
esac
|で複数の値をまとめられる*はそれ以外の条件を表す
まとめ
数値比較の基本
-eq 等しい
-ne 等しくない
-lt より小さい
-le 以下
-gt より大きい
-ge 以上
文字列比較の基本
= 等しい
!= 等しくない
-z 空文字列
-n 空でない
ファイルテスト
-f ファイルが存在するか
-d ディレクトリか
-r 読み取り可能か
-w 書き込み可能か
-x 実行可能か
if文の書き方
if [ 条件 ]; then
処理
elif [ 条件 ]; then
処理
else
処理
fi
case文の書き方
case 変数 in
値1) 処理 ;;
値2) 処理 ;;
*) 処理 ;;
esac

コメント