for
Bashの『for』ループはリスト・ファイル・コマンド出力・数値範囲を繰り返し処理します。シンプルな「for 変数 in リスト」形式のほか、C言語スタイルの「for ((初期化; 条件; 更新))」形式も使えます。
構文
リスト形式で繰り返します。
for 変数 in リスト; do
処理
done
C スタイルで繰り返します。
for (( 初期化; 条件; 更新 )); do
処理
done
ブレース展開と組み合わせます。
for 変数 in {1..10}; do
処理
done
ファイルのグロブと組み合わせます。
for ファイル in *.txt; do
処理
done
構文パターン一覧
| パターン | 概要 |
|---|---|
| for i in 1 2 3 | スペース区切りのリストを順番に処理します。 |
| for i in {1..10} | 1〜10 の整数を順番に処理します。 |
| for i in {1..10..2} | 1, 3, 5, ... とステップ2で処理します。 |
| for f in *.php | カレントディレクトリの .php ファイルを順番に処理します。 |
| for f in $(cmd) | コマンドの出力を行単位で処理します。 |
| for (( i=0; i<n; i++ )) | C スタイルのカウンタループです。 |
| break | ループを途中で終了します。 |
| continue | 現在のイテレーションをスキップして次に進みます。 |
サンプルコード
スペース区切りのリストを順番に処理します。
for_fruits.sh
#!/bin/bash
for fruit in apple banana cherry; do
echo "果物: $fruit"
done
bash for_fruits.sh 果物: apple 果物: banana 果物: cherry
なお、for 文はターミナルでも直接入力できます。『do』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『done』を入力すると実行されます。
for fruit in apple banana cherry; do
echo "果物: $fruit"
done
果物: apple
果物: banana
果物: cherry
ブレース展開『{1..9}』で数値の範囲を指定します。
multiply.sh
for i in {1..9}; do
echo "3 × $i = $(( 3 * i ))"
done
bash multiply.sh 3 × 1 = 3 3 × 2 = 6 3 × 3 = 9 ... 3 × 9 = 27
Cスタイルのカウンタループで1〜100の合計を求めます。
sum_100.sh
sum=0
for (( i=1; i<=100; i++ )); do
(( sum += i ))
done
echo "1〜100の合計: $sum"
bash sum_100.sh 1〜100の合計: 5050
ファイルのグロブ(ワイルドカード)でカレントディレクトリのファイルを処理します。
count_lines.sh
for f in *.php; do
if [ -f "$f" ]; then
echo " $f ($(wc -l < "$f") 行)"
fi
done
bash count_lines.sh index.php (120 行) ajax.php (85 行)
『continue』で偶数をスキップし、『break』で7に達したらループを終了します。
skip_break.sh
for i in {1..10}; do
if (( i % 2 == 0 )); then
continue # 偶数はスキップ
fi
if (( i == 7 )); then
break # 7で停止
fi
echo "$i"
done
bash skip_break.sh 1 3 5
配列の要素を『"${colors[@]}"』で展開してループします。
colors.sh
colors=("red" "green" "blue" "yellow")
for color in "${colors[@]}"; do
echo "色: $color"
done
bash colors.sh 色: red 色: green 色: blue 色: yellow
概要
ファイルのグロブ(『*.php』)は直接 for に使えますが、『for f in $(ls *.php)』のようにコマンド置換を使うとファイル名のスペースで予期せぬ分割が起きます。グロブは直接使うのが安全です。
大量のファイルを処理するときは、find の出力を xargs に渡す方がメモリ効率が良い場合があります。条件付きループには while / until を使います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。