$@ 是否有标准数组名称,例如 ${ARGS[@]}?

$@ 是否有标准数组名称,例如 ${ARGS[@]}?

我不希望它可以修改。也就是说,我不期望它能够启用类似的东西ARGS=("${ARGS[@]}"),而只是简化类似的东西myarray=("${ARGS[@]/--unneeded-argument/}")

请注意,该--unneeded-argument示例并不意味着删除参数我问的原因。这是我多年来一直思考的一个问题,但一直没有得到明确的答案。

答案1

没有对应于 的“常规数组” $@

然而你在涉及数组的许多场景中使用@(但不像${@[@]}您所要求的那样)一条评论-$@已经是@扩展):

$ set 1 2 3
$ array=("$@")
$ echo "${array[0]}"
1
$ echo "${array[1]}"
2
$ myarray=("${@/2/}")
$ echo "${myarray[@]}"
1 3

然而,在最后一步中,结果可能并不完全是您想要的 - 数组仍然具有三个元素,其中一个为空,因为替换是单独应用于所有数组元素的。

答案2

"$@""${foo[@]}"对位置参数的作用与对数组变量的作用相同foo。就像斯蒂芬所说,您可以在带大括号的扩展中使用@,例如切片符号"${@:1:2}"与 相同"$1" "$2"。 (留下第二个数字会扩展到列表的其余部分,例如"${@:2}"扩展到"$2"之后的所有位置参数。)

这和命名变量是一致的,这里特殊参数的“名字”是@$前面的 仅仅触发扩展。请注意,对于普通扩展(内部没有索引或字符串操作),大括号是可选的。 so"${@}"与 相同"$@",您甚至可以写入"${@:1}"相同的效果,因为 的索引@从 1 开始,而不是从零开始。

但是你不能使用${@[@]}, 或${@[1]}.它们分别是$@$1。 (从某种意义上说,$@已经像${args[@]},所以你不能进一步索引它。)这也意味着如果你想索引位置参数,你需要使用切片扩展,例如${@:i:1}获取位置处的元素


但是,请注意数组上的字符串操作扩展或@单独应用于所有元素。例如,这里,从和 中oo删除,但仍然有 left 的第三个元素,它只是空的:foooo@

$ set -- foo bar oo
$ printf ":%s:\n" "${@/oo}"
:f:
:bar:
::

如果您想实际删除该元素,则必须执行其他操作,例如循环遍历值并删除您不需要的元素。借助命名数组,这可能比尝试在$@.说吧,像这样:

a=();
for x in "$@"; do
    if [[ $x != oo ]]; then
        a+=("$x");
    fi;
done

或者这个问题的任何(更好)答案:如何从 $@ 中删除位置参数

相关内容