我不希望它可以修改。也就是说,我不期望它能够启用类似的东西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 的第三个元素,它只是空的:foo
oo
@
$ set -- foo bar oo
$ printf ":%s:\n" "${@/oo}"
:f:
:bar:
::
如果您想实际删除该元素,则必须执行其他操作,例如循环遍历值并删除您不需要的元素。借助命名数组,这可能比尝试在$@
.说吧,像这样:
a=();
for x in "$@"; do
if [[ $x != oo ]]; then
a+=("$x");
fi;
done
或者这个问题的任何(更好)答案:如何从 $@ 中删除位置参数