我希望能够... && add-arg 'something'
将“某些东西”添加到位置参数中,有点像逆shift
。
我尝试过... && set "$@ something"
,但这不起作用,尽管只是做set "$@ something"
(没有条件)似乎工作正常。
答案1
在任何 POSIX shell 中,
set -- "$@" "value"
将添加value
到位置参数列表的末尾(它实际上会用一个新的更长列表替换该列表),并且
set -- "value" "$@"
会将其添加到开头(从技术上讲,它与 a 相反,shift
因为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"