1.06.2標準
ラッパースクリプトが受け取った全位置引数をrun_taskへそのまま渡す。
空白を含む引数も元の1引数として保持する。
適切な記述はどれか。
× 不正解
"$@"は各位置引数を個別に引用された形で展開し、引数数と境界を保って転送できる。
詳細解説
誤り
run_task $@未引用の展開は単語分割やglob展開を受け、元の境界を失い得る。
未引用の$@は展開後に単語分割とglob展開を受ける。two wordsが2引数へ分かれるなど元の境界を失い得る。
正しい
run_task "$@"各位置引数をそれぞれ独立した1引数として展開する。
"$@"は各位置引数を個別の引用済み語として展開する。引数数と空白を含む値の境界をそのままrun_taskへ渡せる。
誤り
run_task "$*"全位置引数をIFS先頭文字で連結した1引数にする。
"$*"はすべての位置引数を1つの文字列へ連結する。run_taskが受け取る引数数が1になり、元の境界を保てない。
誤り
run_task "$#"引数内容ではなく個数を1引数として渡す。
"$#"は引数内容ではなく個数を表す整数だけを渡す。run_taskへ元の値を転送しない。
実際に確かめる
一時的な検証環境で実行できる例です。
sh -c 'show() { printf "%s:<%s>\n" "$#" "$1"; }; show "$@"' wrapper 'two words' second期待される結果
2:<two words>理解のポイント
- "$@"は個別引数
- 境界を保持
- ラッパーで使用
確認時の注意
- 確認環境: POSIX sh / 一時関数
基礎のおさらい
個別展開
位置引数がN個なら"$@"もN個のシェル語として展開される。引数が0個なら何も生成しない。
常に引用
引数境界を保つ目的では未引用の$@ではなく、二重引用した"$@"を使用する。
問題IDKL-102-934
確認環境POSIX sh / 一時関数
最終技術確認2026-08-13
誤り・権利侵害を報告