105.2標準
スクリプトが受け取った全引数を、空白を含む引数も分割せず別コマンドへ渡す。
適切な展開はどれか。
× 不正解
"$@"は各位置パラメータを個別の引数として保つ。ラッパースクリプトから別コマンドへ引数を透過的に渡す基本形である。
詳細解説
正しい
"$@"各位置パラメータをそれぞれ独立した引用済み引数として展開する。
正しい。二重引用した$@は各位置パラメータを1語ずつ展開し、空の引数や空白を含む引数も保持する。
誤り
$@未引用のため、展開後に単語分割やパス名展開の影響を受ける。
誤り。引用しない$@はIFSによる単語分割とパス名展開を受け、呼出元が渡した境界を壊す可能性がある。
誤り
"$*"全位置パラメータを1つの文字列へ結合する。
誤り。引用した$*は全引数をIFSの先頭文字で連結した単一の語にし、複数引数として転送しない。
誤り
$*結合した展開結果がさらに単語分割され、元の境界を保持しない。
誤り。未引用の$*は連結後に再分割されるため、元の引数境界を復元できない。
実際に確かめる
一時的な検証環境で実行できる例です。
bash --noprofile --norc -c 'printf "<%s>\n" "$@"' demo 'two words' tail期待される結果
<two words>と<tail>の2行理解のポイント
- $@は全位置引数
- 二重引用で境界維持
- $*との違い
確認時の注意
- 確認環境: GNU Bash 5.2 / 短命シェル
基礎のおさらい
ラッパー処理
別コマンドへ受け取った引数をそのまま転送するときはcommand "$@"を基本形にする。
空引数
"$@"は明示的に渡された空文字引数も1引数として保つが、位置引数が0個なら何も展開しない。
問題IDKP-105-622
確認環境GNU Bash 5.2 / 短命シェル
最終技術確認2026-08-13
誤り・権利侵害を報告