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.
[2] Bash Reference Manual - Looping Constructs.