1.06.2標準
位置引数alpha、two words、omegaを、IFSの先頭文字で連結した1引数としてprintfへ渡す。
各引数の境界を維持した複数引数転送ではない。
適切な展開はどれか。
× 不正解
"$*"は全位置引数をIFSの先頭文字で連結した1つのシェル語として展開する。"$@"とは引数境界が異なる。
詳細解説
誤り
$@未引用で単語分割やglob展開を受ける。
未引用の$@は各値を展開した後に単語分割などを受ける。1つの連結文字列を保証しない。
誤り
"$@"各位置引数を別々の引数として展開する。
"$@"はalpha、two words、omegaを3個の引数として展開する。1引数にまとめる要件とは異なる。
正しい
"$*"全位置引数をIFSの先頭文字でつないだ1引数へ展開する。
"$*"はIFSの先頭文字で全位置引数を連結し、1個の引数として展開する。IFS=,ならカンマ区切りになる。
誤り
"$#"位置引数の個数を1つの文字列として展開する。
"$#"は値の内容を捨てて個数3だけを展開する。連結された引数文字列を作らない。
実際に確かめる
一時的な検証環境で実行できる例です。
sh -c 'IFS=,; printf "<%s>\n" "$*"' join alpha 'two words' omega期待される結果
<alpha,two words,omega>理解のポイント
- "$*"は1引数
- IFS先頭文字で連結
- "$@"は個別引数
確認時の注意
- 確認環境: POSIX sh / 短命プロセス
基礎のおさらい
IFS先頭文字
"$*"の引数間にはIFSの最初の文字が挿入される。既定では空白になる。
用途を限定
一般的な引数転送には"$@"を使い、意図的に1文字列へ結合する場合だけ"$*"を使う。
問題IDKL-102-935
確認環境POSIX sh / 短命プロセス
最終技術確認2026-08-13
誤り・権利侵害を報告