$ @にパラメータを追加するにはどうすればよいですか?

$ @にパラメータを追加するにはどうすればよいですか?

... && add-arg 'something'私は駅などの位置パラメータに「何か」を追加できるようにしたいと思いますshift

私はそれを試しましたが、... && set "$@ something"それは動作しません。条件なしset "$@ something"でそれをするだけでうまく動作するようです。

答え1

すべてのPOSIXシェルでは、

set -- "$@" "value"

value位置引数リストの末尾に追加されます(実際にはリストを新しく長いリストに置き換えます)。

set -- "value" "$@"

最初に追加します(技術的には最初の要素が削除されるため、shiftaとは反対です)。shiftこれはに適用されますzsh

--次の値がで始まる場合は、誤ってオプションとして解釈されるのを防ぐために使用されます-

特殊変数は、個別に参照される各位置引数の値に拡張されるため、$@ほぼ排他的に使用されます。"$@"式は、"$@ somethingelse"個別に引用された位置引数のリストに展開され、最後の引数に<space>somethingelse追加されます。

位置パラメータの値を次のように使用します。単一文字列スペース(または最初の文字$IFS)で区切って"$*""$* somethingelse"単一の文字列として明確に定義されている)を使用してください。しかし、これはいいえこの場合、あなたが望むのは、値のリストを単一の値に縮小することです。

答え2

具体zsh的には、set -- "$@" ...@Kusalanandaが表示した基準を満たしています。、位置パラメータは配列を介しても使用できるため$argv (cshと同様)、次のようにすることもできます。

argv+=arg             # append one argument to the end
argv+=(arg2 arg3)     # append several arguments
argv[1,0]=(arg1 arg2) # insert in front
argv[3,0]=(x)         # insert before the 3rd element
2+=(x)                # same as above (insert after the 2nd)
2+=x                  # append x to the second argument (not to confuse with
                      # the above).
argv[2,5]=(y)         # replace 4 elements 2 to 5 with one y argument
argv[3,-1]=()         # truncate
1=()                  # same as "shift"

関連情報