Q1for f in *.txt; do ... doneは何を繰り返しますか?
繰り返し — for でファイルを 1 件ずつ処理
この記事は、基礎コマンドからシェルスクリプトまでLinuxの実践的なスキルを1からマスターする「Linux入門講座の一部」です。
for f in *.txtでファイル一覧を回し、while [ "$i" -le 3 ]やuntilで条件付きに繰り返し、continueで空行をとばしbreakで上限到達時に打ち切る制御を、図解と端末で実習します。
リストを順に処理する — for
forは与えた値を 1 つずつ取り出して、同じ処理を繰り返します。
for v in a b c; do ... doneの形で、vにa・b・cが順に入ります。
doとdoneの間が繰り返す本体です。
値の並びは直接書くほか、*.txtのようなファイルパターンや$(...)のコマンド出力も使えます。
for f in *.txtと書くと、カレントディレクトリの.txtファイルが順にfに入り、ファイルごとの処理を書けます。
for line in $(cat list.txt)のように$(...)を使うと、コマンドの出力を反復対象にできます。
これにより、ファイル一覧の集計や複数ファイルの一括処理が書けます。
for env in dev stg prod; do # 並べた値を順に処理
echo "deploying to $env"
done
for f in *.sh; do # .sh ファイルを順に処理
echo "script: $f"
done
forはリストから 1 件ずつfに取り出して本体を実行し、要素が尽きたらdoneで終わります。| 書き方 | 意味 | 例 |
|---|---|---|
for v in a b c; do … done | 並べた値を順に処理する | for v in dev stg prod; do echo $v; done |
for f in *.txt; do … | 条件に合うファイルを順に処理 | for f in *.txt; do wc -l "$f"; done |
for x in $(cmd); do … | コマンド出力を順に処理 | for d in $(ls); do echo $d; done |
do … done | ループ本体の開始と終了 | for v in a b; do echo $v; done |
条件で繰り返す — while / until
whileは条件が真の間くり返します。
while [ "$i" -lt 3 ]; do ... doneのように、本体の中でカウンタを増やして終了に向かわせます。
untilは逆に、条件が真になるまで繰り返します。
回数があらかじめ決まらない処理に向きます。
i=1
while [ "$i" -le 3 ]; do # i が 3 以下の間くり返す
echo "try $i"
i=$((i + 1))
done # try 1 / try 2 / try 3
i=1
until [ "$i" -gt 3 ]; do # 条件が真になるまで繰り返す
echo "i=$i"
i=$((i + 1))
done # i=1 / i=2 / i=3
whileは条件が真の間、untilは条件が真になるまで本体を繰り返します。どちらも本体でカウンタを進めて終了に近づけます。| 書き方 | 意味 | 例 |
|---|---|---|
while [ cond ]; do … done | 条件が真の間くり返す | while [ "$i" -lt 3 ]; do …; done |
until [ cond ]; do … done | 条件が真になるまでくり返す | until [ -f done.flag ]; do …; done |
forで制御する — break / continue
forで一覧を回す途中でも、breakとcontinueで流れを変えられます。
continueはその回の残りをとばして次の要素へ進み、breakはループ自体を終了します。
if [ 条件 ]; then continue; fiやif [ 条件 ]; then break; fiの形で条件と組み合わせ、不要な要素はとばす・目的の件数で打ち切るといった制御ができます。
for n in 1 2 3 4 5; do
if [ "$n" -eq 3 ]; then continue; fi # 3 はとばす
if [ "$n" -eq 5 ]; then break; fi # 5 で抜ける
echo "n=$n"
done # n=1 / n=2 / n=4
forはn=1から順に本体を実行します。n=3のcontinueで残りをとばして次へ進み、n=5のbreakでループ自体を終了します(出力は n=1 / n=2 / n=4)。| 書き方 | 意味 | 例 |
|---|---|---|
continue | その回をとばし次の繰り返しへ | if [ -z "$x" ]; then continue; fi |
break | ループを途中で抜ける | if [ "$n" -gt 100 ]; then break; fi |
whileで制御する — break / continue
whileの条件判定に加えて、breakとcontinueを使うと途中での打ち切りや読み飛ばしができます。
continueはその回をとばして条件判定へ戻り、breakは条件を待たずにループを抜けます。
このとき、カウンタの更新を本体の先頭(continueより前)に置かないと、とばした回で更新されず終わらなくなる点に注意します。
i=0
while [ "$i" -lt 10 ]; do
i=$((i + 1)) # 先頭で進める
if [ "$i" -eq 3 ]; then continue; fi # 3 回目はとばす
if [ "$i" -eq 6 ]; then break; fi # 6 回目で抜ける
echo "attempt $i"
done # attempt 1 / 2 / 4 / 5
whileは条件が真の間、iを 1 ずつ進めて本体を実行します。i=3のcontinueは条件判定へ戻り、i=6のbreakは条件を待たずにループを終了します(出力は attempt 1 / 2 / 4 / 5)。| 書き方 | 意味 | 例 |
|---|---|---|
continue | その回をとばし条件判定へ戻る | if [ $((i % 3)) -eq 0 ]; then continue; fi |
break | 条件を待たずにループを抜ける | if [ "$found" -ge 4 ]; then break; fi |
| カウンタ更新の位置 | continueより前で更新する | i=$((i + 1))を本体の先頭に置く |
理解度チェック
まずは1問ずつ答えてみましょう。
Q2条件が真の間くり返すのはどのキーワードですか?
Q3その回だけとばして次の繰り返しに進むのはどれですか?