![「$@」と「$@[@]」の相対的な利点について](https://linux33.com/image/103234/%E3%80%8C%24%40%E3%80%8D%E3%81%A8%E3%80%8C%24%40%5B%40%5D%E3%80%8D%E3%81%AE%E7%9B%B8%E5%AF%BE%E7%9A%84%E3%81%AA%E5%88%A9%E7%82%B9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6.png)
引数を別のダウンストリーム「呼び出し可能」(バイナリ、スクリプト、関数など)に「渡す」必要なスクリプト(または関数)を作成するたびに、次のように引数を渡すfoo
コードを作成します。
foo "$@"
...しかし、この代替案も見たことがあります。
foo "$@[@]"
zsh
私はこれら2つの方法が異なる結果を生み出しますが、成功しないシナリオを作成しようとしました(少なくとも成功しませんでした)。
本当に同義ですか?そうでなければ、人々はいつ他のフォームよりも1つのフォームを好むでしょうか?
zsh
(私はこれが日常的なシェルである状況に主に興味がありますが、仕事ではスクリプトを書く必要があることが多いので、bash
この質問に対する答えも疑問に思います。)bash
答え1
"$@"
Bourne Shell(1979)の発明品です。これは、入力したように位置引数のリストに展開されることを意味します"$1" "$2" "$3"...
。
David Kornは、1980年代初めに配列サポートを追加したときに構文を使用して概念を配列に拡張しました"${array[@]}"
。より短いフォーマットzsh
もサポートされています。"$array[@]"
"$@"
$1
配列と少し似ていますが、またはzsh
を除いてyash
完全に同じではない位置パラメータ(最初から)を示します。 1つは$@
インデックス1から始まり、もう1つの配列は0から始まりksh
ますbash
。またはでは動作しません${@[@]}
。ksh
bash
唯一の"${@[@]}"
利用できるシェルはzsh
およびですyash
。動作するzsh
唯一のものです"$@[@]"
。標準以上で使用することは意味がありません"$@"
。より有用な説明は次のとおりです。"$@[1,3]"
最初の3つの位置パラメータを取得します。
配列に似た構文を使用するにはzsh
( // など"$argv[@]"
の$argv
位置パラメータを参照する配列csh
)で使用できます。tcsh
fish