1.06.2標準
現在のディレクトリにある拡張子.logの各ファイルを変数fileへ順に代入する。
ループ本体ではファイル名を引用して表示する。
適切な記述はどれか。
× 不正解
for file in ./*.logはglob展開された各パスを順に処理する。変数展開は"$file"と引用して1引数を保つ。
詳細解説
正しい
for file in ./*.log; do printf '%s\n' "$file"; doneglobの各一致結果をfileへ順に代入し、引用して表示する。
./*.logはループ開始前に一致するパス群へ展開される。各パスはfileへ1つずつ入り、"$file"の引用で空白を含む名前も保てる。
誤り
for file in './*.log'; do printf '%s\n' "$file"; doneglob全体を単一引用し、展開せず固定文字列を1回処理する。
単一引用された./*.logはglob展開されず、文字列そのものを1回だけ処理する。実ファイル一覧にならない。
誤り
for file = ./*.log; printf '%s\n' "$file"forの代入やdo/doneの構文が欠けている。
forの変数名へ=を付けず、値一覧の前にはin、本体の前後にはdoとdoneが必要である。記述は構文として成立しない。
誤り
while file in ./*.log; do printf '%s\n' "$file"; donewhileはこの形式でglob一覧を反復しない。
whileは条件を繰り返し評価する構文で、このinリスト形式を持たない。globの各結果を自動で変数へ代入しない。
実際に確かめる
一時的な検証環境で実行できる例です。
bash -c 'd=$(mktemp -d); touch "$d/a.log" "$d/b file.log"; cd "$d"; for file in ./*.log; do printf "%s\n" "$file"; done; rm -rf "$d"'期待される結果
./a.logと./b file.logを1行ずつ表示理解のポイント
- globは引用せず展開
- 変数は引用
- 空白を含む名前を1引数に保つ
確認時の注意
- 確認環境: GNU Bash 5.2 / 一時ディレクトリ
- 一致が0件の場合のglob動作はシェルオプションで変わるため、必要なら存在確認を加える。
基礎のおさらい
glob展開
*.logはシェルが既存パス名へ展開する。引用すると*の特別な意味が失われる。
空白を含むパス
変数へ入ったパスは"$file"と引用し、単語分割や再glob展開を防ぐ。
問題IDKL-102-921
確認環境GNU Bash 5.2 / 一時ディレクトリ
最終技術確認2026-08-13
誤り・権利侵害を報告