105.2標準
スクリプトへ渡された各引数を、空白を含む引数の境界を保ちながら1回ずつ変数itemへ入れる。
適切なfor文はどれか。
× 不正解
for name in "$@"は全引数を元の境界のまま反復する。ループ内でも"$item"と引用して次のコマンドへ渡す。
詳細解説
誤り
for item in "$*"; do process "$item"; done全引数を1つの文字列へ結合するため、反復は1回になる。
誤り。"$*"は全位置パラメータを1つの語へ結合するため、複数引数でもitemへの代入は1回だけになる。
誤り
for item in $@; do process "$item"; done未引用展開により単語分割やパス名展開で引数境界が変わり得る。
誤り。未引用の$@は単語分割とパス名展開を受け、空白を含む1引数が複数回の反復へ分かれる可能性がある。
誤り
for item while "$@"; do process "$item"; doneforの有効な構文ではなく、whileをこの位置へ置けない。
誤り。for name in wordsとwhile conditionは別の制御構文であり、この順序で組み合わせる文法はない。
正しい
for item in "$@"; do process "$item"; done各位置パラメータを独立した語として順にitemへ代入する。
正しい。"$@"が各位置パラメータを個別の語として展開し、forが順番にitemへ代入する。
実際に確かめる
一時的な検証環境で実行できる例です。
bash --noprofile --norc -c 'for item in "$@"; do printf "<%s>\n" "$item"; done' demo 'two words' tail期待される結果
<two words>と<tail>の2行理解のポイント
- forは語ごとに反復
- "$@"で境界維持
- ループ変数も引用
確認時の注意
- 確認環境: GNU Bash 5.2 / 短命シェル
基礎のおさらい
省略形
for item; do ...; doneのようにin節を省略した場合も、シェルは位置パラメータを順に反復する。
ループ内の引用
process "$item"のようにループ変数も引用し、保存した引数境界を次のコマンドまで維持する。
問題IDKP-105-629
確認環境GNU Bash 5.2 / 短命シェル
最終技術確認2026-08-13
誤り・権利侵害を報告