はじめに

こんにちは!今回はfor文について解説します。

forは繰り返し処理(ループ)を行うための構文です。「リストの要素を1つずつ処理する」とか「1から10まで繰り返す」みたいな時に使います。

for文とは

forは、指定した回数や範囲で処理を繰り返すための制御構文です。

複数のファイルを一括処理したり、連番で何か処理したりする時に便利です。手作業でやったら大変な繰り返し作業を、サクッと自動化できます。

基本構文

リストを使った形

1
2
3
for 変数 in リスト; do
    # 繰り返し実行する処理
done

C言語風の形(数値ループ)

1
2
3
for ((i=1; i<=10; i++)); do
    # 繰り返し実行する処理
done

使用例

例1: 基本的なリストループ

1
2
3
for fruit in apple banana orange; do
    echo "好きな果物: $fruit"
done

実行結果:

1
2
3
好きな果物: apple
好きな果物: banana
好きな果物: orange

例2: 数値の範囲指定

1
2
3
for i in {1..5}; do
    echo "数: $i"
done

実行結果:

1
2
3
4
5
数: 1
数: 2
数: 3
数: 4
数: 5

{1..5}で1から5までの範囲を指定できます。

例3: C言語風のループ

1
2
3
for ((i=1; i<=3; i++)); do
    echo "回数: $i"
done

実行結果:

1
2
3
回数: 1
回数: 2
回数: 3

こっちの書き方の方が慣れてる人もいるかもですね。

例4: ファイルのループ処理

1
2
3
for file in *.txt; do
    echo "処理中: $file"
done

実行結果:

1
2
3
処理中: file1.txt
処理中: file2.txt
処理中: notes.txt

カレントディレクトリの.txtファイルを全部処理できます。

例5: 配列のループ

1
2
3
4
5
files=("file1.txt" "file2.txt" "file3.txt")

for file in "${files[@]}"; do
    echo "ファイル: $file"
done

実行結果:

1
2
3
ファイル: file1.txt
ファイル: file2.txt
ファイル: file3.txt

配列の要素を1つずつ処理できます。

例6: コマンドの出力をループ

1
2
3
for user in $(cat users.txt); do
    echo "ユーザー: $user"
done

ファイルの内容を1行ずつ処理したり。

例7: 2つずつ増やす

1
2
3
for i in {0..10..2}; do
    echo "偶数: $i"
done

実行結果:

1
2
3
4
5
6
偶数: 0
偶数: 2
偶数: 4
偶数: 6
偶数: 8
偶数: 10

{開始..終了..増分}で刻み幅を指定できます。

Tips・注意点

  • ワイルドカードが便利: *.txtとか*.jpgとかで一括処理できます

    1
    2
    3
    
    for img in *.jpg; do
        convert "$img" "${img%.jpg}.png"
    done
    
  • スペースを含むファイル名: ダブルクォートで囲みましょう

    1
    2
    3
    4
    
    for file in *.txt; do
        cat "$file"  # 正しい
        cat $file    # ファイル名にスペースがあるとエラー
    done
    
  • ファイルが存在しない場合: *.txtにマッチするファイルがないと、*.txtそのものがリストになっちゃいます

    1
    2
    3
    4
    
    for file in *.txt; do
        [ -f "$file" ] || continue  # ファイルが存在しない場合スキップ
        echo "$file"
    done
    
  • break と continue: ループを抜けたりスキップしたり

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    for i in {1..10}; do
        if [ $i -eq 5 ]; then
            break  # ループを抜ける
        fi
        echo $i
    done
    
    for i in {1..5}; do
        if [ $i -eq 3 ]; then
            continue  # この回をスキップ
        fi
        echo $i
    done
    
  • seq コマンドも使える: 古いシステムで{1..10}が使えない場合

    1
    2
    3
    
    for i in $(seq 1 10); do
        echo $i
    done
    

実践的な使い方

ファイルの一括リネーム

1
2
3
4
5
6
7
#!/bin/bash

for file in *.jpg; do
    newname="photo_${file}"
    mv "$file" "$newname"
    echo "リネーム: $file$newname"
done

バックアップスクリプト

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#!/bin/bash

backup_dir="backup_$(date +%Y%m%d)"
mkdir -p "$backup_dir"

for file in *.conf; do
    cp "$file" "$backup_dir/"
    echo "バックアップ: $file"
done

echo "完了: $backup_dir"

ディレクトリの一括作成

1
2
3
4
5
6
7
#!/bin/bash

for i in {1..10}; do
    dir="project_$i"
    mkdir -p "$dir"
    echo "作成: $dir"
done

ログファイルの処理

1
2
3
4
5
6
7
#!/bin/bash

for log in /var/log/*.log; do
    echo "=== $log ==="
    tail -n 5 "$log"
    echo
done

複数サーバーへのping

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

servers=("192.168.1.1" "192.168.1.2" "192.168.1.3")

for server in "${servers[@]}"; do
    echo -n "$server: "
    if ping -c 1 -W 1 "$server" > /dev/null 2>&1; then
        echo "OK"
    else
        echo "NG"
    fi
done

ファイルの内容を一括変換

1
2
3
4
5
6
7
#!/bin/bash

for file in *.txt; do
    # 小文字を大文字に変換
    tr '[:lower:]' '[:upper:]' < "$file" > "${file%.txt}_upper.txt"
    echo "変換完了: $file"
done

まとめ

今回はfor文について解説しました。

ポイント:

  • forで繰り返し処理ができる
  • リスト、範囲、ファイルなど色々な対象をループできる
  • ワイルドカードで複数ファイルを一括処理できる
  • 変数はダブルクォートで囲むのが安全

ファイルの一括処理とか、同じ作業を何回も繰り返す時にfor文は超便利です。手作業でやったら面倒な作業も、スクリプト一発で終わらせられます。

次回もLinuxコマンドの学習を続けていきましょう!