6.2 制御構造

Control Structures

条件分岐(if, case)とループ(for, while)を使ってプログラムの流れを制御する。

if文

#!/bin/bash

# 基本形
if [ 条件 ]; then
    コマンド
fi

# if-else
if [ 条件 ]; then
    コマンド1
else
    コマンド2
fi

# if-elif-else
if [ 条件1 ]; then
    コマンド1
elif [ 条件2 ]; then
    コマンド2
else
    コマンド3
fi
数値比較 意味
-eq 等しい
-ne 等しくない
-lt より小さい
-le 以下
-gt より大きい
-ge 以上
文字列比較 意味
= 等しい
!= 等しくない
-z 空文字
-n 空でない
ファイル判定 意味
-e 存在する
-f 通常ファイル
-d ディレクトリ
-r / -w / -x 読込/書込/実行可能
# 例
if [ -f "$FILE" ]; then
    echo "File exists"
fi

if [ "$COUNT" -gt 10 ]; then
    echo "Greater than 10"
fi

# [[ ]] は拡張構文(推奨)
if [[ "$STR" == *pattern* ]]; then
    echo "Match"
fi

case文

case $VAR in
    pattern1)
        コマンド1
        ;;
    pattern2|pattern3)
        コマンド2
        ;;
    *)
        デフォルト
        ;;
esac

# 例
case $1 in
    start)
        echo "Starting..."
        ;;
    stop)
        echo "Stopping..."
        ;;
    restart)
        echo "Restarting..."
        ;;
    *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
        ;;
esac

forループ

# リスト
for i in 1 2 3 4 5; do
    echo $i
done

# 範囲(bash 3.0+)
for i in {1..10}; do
    echo $i
done

# ファイル一覧
for file in *.txt; do
    echo "Processing $file"
done

# C言語風
for ((i=0; i<10; i++)); do
    echo $i
done

# コマンド出力
for user in $(cat users.txt); do
    echo "User: $user"
done

whileループ

# 基本形
while [ 条件 ]; do
    コマンド
done

# カウンタ
count=0
while [ $count -lt 5 ]; do
    echo $count
    count=$((count + 1))
done

# ファイル読み込み
while IFS= read -r line; do
    echo "$line"
done < file.txt

# 無限ループ
while true; do
    # 処理
    sleep 1
done

# パイプから読み込み
cat file.txt | while read line; do
    echo "$line"
done

break / continue

for i in {1..10}; do
    if [ $i -eq 5 ]; then
        break    # ループ終了
    fi
    echo $i
done

for i in {1..10}; do
    if [ $i -eq 5 ]; then
        continue  # 次の繰り返しへ
    fi
    echo $i
done
出典
[1] Bash Reference Manual - Conditional Constructs.
[2] Bash Reference Manual - Looping Constructs.