如何向 $@ 添加参数?

如何向 $@ 添加参数?

我希望能够... && 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"

相关内容