LinuCレベル1 シェルおよびスクリプト 問19
シェルおよびスクリプト/シェルスクリプトシェルスクリプトwrap.shが受け取った引数を、すべてそのままcpコマンドへ渡したい。「./wrap.sh "my file.txt" /backup」のように空白を含む引数があっても、引数の区切りを保ったまま渡せる記述として適切なものはどれか。
当サイトのオリジナル問題(LinuCレベル1の出題範囲「シェルおよびスクリプト」に対応。実際の試験問題ではありません)
- Acp "$@"
- Bcp "$*"
- Ccp $*
- Dcp $@
正解:A
解説
ダブルクォートで囲んだ "$@" は、"$1" "$2" … のように位置パラメータを1つずつ別の単語として展開するため、空白を含む引数もその区切りのまま渡せます。一方 "$*" は、すべての引数をIFSの先頭文字(通常は空白)でつないだ1つの単語に展開します。クォートしない $* や $@ は展開後に単語分割されるため、"my file.txt" が my と file.txt の2つに分かれてしまいます。引数の個数は $#、スクリプト自身の名前は $0 で参照します。
選択肢ごとの解説
- A正しい。"$@" は各引数を別々の単語として展開するので、空白を含む引数もそのまま1つの引数として渡せます。
- B誤り。"$*" はすべての引数を1つの文字列につないで展開するため、cpには引数が1つだけ渡されます。
- C誤り。クォートしない $* は単語分割されるため、"my file.txt" が2つの引数に分かれてしまいます。
- D誤り。クォートしない $@ も単語分割の対象になるため、空白を含む引数が分かれてしまいます。