... && add-arg 'something'
私は駅などの位置パラメータに「何か」を追加できるようにしたいと思いますshift
。
私はそれを試しましたが、... && set "$@ something"
それは動作しません。条件なしset "$@ something"
でそれをするだけでうまく動作するようです。
答え1
すべてのPOSIXシェルでは、
set -- "$@" "value"
value
位置引数リストの末尾に追加されます(実際にはリストを新しく長いリストに置き換えます)。
set -- "value" "$@"
最初に追加します(技術的には最初の要素が削除されるため、shift
aとは反対です)。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"