言語
日本語
English

Caution

お使いのブラウザはJavaScriptが無効になっております。
当サイトでは検索などの処理にJavaScriptを使用しています。
より快適にご利用頂くため、JavaScriptを有効にしたうえで当サイトを閲覧することをお勧めいたします。

  1. トップページ
  2. Bash辞典
  3. for

for

対応: Bash 1.0(1989)

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現在のイテレーションをスキップして次に進みます。

サンプルコード

スペース区切りのリストを順番に処理します。

sample_for_members.sh
#!/bin/bash
for member in "Iori Yagami" "Kusanagi Kyo" "Terry Bogard"; do
    echo "メンバー: $member"
done
bash for_members.sh
メンバー: Iori Yagami
メンバー: Kusanagi Kyo
メンバー: Terry Bogard

なお、for 文はターミナルでも直接入力できます。『do』の後で Enter を押すと『> 』マークが表示され、これは「まだ入力が続く」というサインで、『done』を入力すると実行されます。

for member in "Iori Yagami" "Kusanagi Kyo" "Terry Bogard"; do
    echo "メンバー: $member"
done
メンバー: Iori Yagami
メンバー: Kusanagi Kyo
メンバー: Terry Bogard

ブレース展開『{1..9}』で数値の範囲を指定します。

sample_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の合計を求めます。

sample_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

ファイルのグロブ(ワイルドカード)でカレントディレクトリのファイルを処理します。

sample_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に達したらループを終了します。

sample_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

配列の要素を『"${fighters[@]}"』で展開してループします。

sample_fighters.sh
fighters=("Iori Yagami" "Kusanagi Kyo" "Terry Bogard" "Blue Mary")
for fighter in "${fighters[@]}"; do
    echo "ファイター: $fighter"
done
bash fighters.sh
ファイター: Iori Yagami
ファイター: Kusanagi Kyo
ファイター: Terry Bogard
ファイター: Blue Mary

概要

ファイルのグロブ(『*.php』)は直接 for に使えますが、『for f in $(ls *.php)』のようにコマンド置換を使うとファイル名のスペースで予期せぬ分割が起きます。グロブは直接使うのが安全です。

大量のファイルを処理するときは、find の出力を xargs に渡す方がメモリ効率が良い場合があります。条件付きループには while / until を使います。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。