Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
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 | 現在のイテレーションをスキップして次に進みます。 |
サンプルコード
スペース区切りのリストを順番に処理します。
#!/bin/bash
for fruit in apple banana cherry; do
echo "果物: $fruit"
done
果物: apple 果物: banana 果物: cherry
ブレース展開『{1..9}』で数値の範囲を指定します。
for i in {1..9}; do
echo "3 × $i = $(( 3 * i ))"
done
3 × 1 = 3 3 × 2 = 6 3 × 3 = 9 ... 3 × 9 = 27
Cスタイルのカウンタループで1〜100の合計を求めます。
sum=0
for (( i=1; i<=100; i++ )); do
(( sum += i ))
done
echo "1〜100の合計: $sum"
1〜100の合計: 5050
ファイルのグロブ(ワイルドカード)でカレントディレクトリのファイルを処理します。
for f in *.php; do
if [ -f "$f" ]; then
echo " $f ($(wc -l < "$f") 行)"
fi
done
index.php (120 行) ajax.php (85 行)
『continue』で偶数をスキップし、『break』で7に達したらループを終了します。
for i in {1..10}; do
if (( i % 2 == 0 )); then
continue # 偶数はスキップ
fi
if (( i == 7 )); then
break # 7で停止
fi
echo "$i"
done
1 3 5
配列の要素を『"${colors[@]}"』で展開してループします。
colors=("red" "green" "blue" "yellow")
for color in "${colors[@]}"; do
echo "色: $color"
done
色: red 色: green 色: blue 色: yellow
概要
ファイルのグロブ(*.php)は直接 for に使えますが、for f in $(ls *.php) のようにコマンド置換を使うとファイル名のスペースで予期せぬ分割が起きます。グロブは直接使うのが安全です。
大量のファイルを処理するときは、find の出力を xargs に渡す方がメモリ効率が良い場合があります。条件付きループには while / until を使います。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。