web-dev-qa-db-ja.com

$ @に引数を追加するにはどうすればよいですか?

私は... && add-arg 'something'ができるのが好きで、逆のshiftのように、位置引数に「何か」を追加します。

... && set "$@ something"を試しましたが、set "$@ something"(条件なし)を実行するだけで正しく機能するように見えましたが、これは機能しませんでした。

5
HappyFace

具体的には、zshを使用すると、さらに @ Kusalanandaで示される標準のset -- "$@" ... 、位置パラメーターは$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"
2

POSIXシェルでは、

set -- "$@" "value"

位置パラメータのリストの最後にvalueを追加し(実際にはリストを新しい長いリストに置き換えます)、

set -- "value" "$@"

最初に追加します(技術的には、shiftが最初の要素を削除するため、shiftの逆になります)。これはzshにも当てはまります。

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

特別な変数$@はほとんど排他的に"$@"として使用されます。これは、個別に引用された各位置パラメーターの値に拡張されるためです。式"$@ somethingelse"は、個別に引用された位置パラメータのリストに展開され、最後に<space>somethingelseが追加されます。

位置パラメータの値をスペースで区切られた単一の文字列(または$IFSの最初の文字が何であれ)として使用するには、"$*""$* somethingelse"単一の文字列として明確に定義されています)。ただし、これはnot値のリストを単一の値に折りたたむため、このインスタンスで実行したいことです。

8
Kusalananda