「$@」と「$@[@]」の相対的な利点について

「$@」と「$@[@]」の相対的な利点について

引数を別のダウンストリーム「呼び出し可能」(バイナリ、スクリプト、関数など)に「渡す」必要なスクリプト(または関数)を作成するたびに、次のように引数を渡す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。またはでは動作しません${@[@]}kshbash

唯一の"${@[@]}"利用できるシェルはzshおよびですyash。動作するzsh唯一のものです"$@[@]"。標準以上で使用することは意味がありません"$@"。より有用な説明は次のとおりです。"$@[1,3]"最初の3つの位置パラメータを取得します。

配列に似た構文を使用するにはzsh( // など"$argv[@]"$argv位置パラメータを参照する配列csh)で使用できます。tcshfish

おすすめ記事