導入
for は「用意した値を、1つずつ変数に入れて、同じ処理を繰り返す」ための道具です。シェルの for はカウンタを回すというより、リストをなめるもの——この感覚がしっくりくると使いこなせます。
説明
型はこうです。
#!/bin/bash
for name in 佐藤 鈴木 高橋; do
echo "$name さん、こんにちは"
done
echo "---"
# ファイル名を1つずつ処理する(実務でいちばん多い形)
for file in files/*.txt; do
echo "処理中: $file"
done
for 変数 in 値1 値2 …… 値を空白区切りで並べるdo〜done… 繰り返す中身- ループの中では
$変数で今の値を取り出す
flowchart TD
A["for name in 佐藤 鈴木 高橋"] --> B{"次の値はある?"}
B -->|"ある"| C["name に次の値を入れる"]
C --> D["do 〜 done の中を実行"]
D --> B
B -->|"ない"| E["done(ループ終了)"]
値の並べ方には、いくつも書き方があります。
| 書き方 | 意味 |
|---|---|
for f in a b c | 直接並べる |
for f in files/*.txt | ファイル名の展開(一致したファイルの分だけ回る) |
for i in $(seq 1 5) | 1〜5 の連番 |
for arg in "$@" | スクリプトに渡された引数すべて |
files/*.txt のような書き方を ファイル名展開(グロブ) と呼びます。シェルが実行前に、一致する実際のファイル名へ置き換えてくれます。「ディレクトリ内の全ファイルを処理する」が、たった1行で書けるということです。
やってみよう
スクリプトを実行して、3人の名前と3つのファイルが順に処理されることを確かめましょう。次に files/*.txt を files/* に変えて実行し、memo.md も対象に入ることを確認してください。ファイル名展開が「その場のファイル状況」で決まることが体感できます。
演習
for と $(seq 1 3) を使って、1回目 2回目 3回目 と順に表示してください。
ヒント1を見る
for i in $(seq 1 3); do … done の形です。
ヒント2を見る
ループの中は echo "${i}回目"