在bash中将argv条目附加到数组中(动态填充数组)

5

我正在尝试在Bash中将参数列表("$@")中排除$1和任何以破折号开头的值,追加到数组中。

以下是我的当前代码,但它无法正常运行:

BuildTypeList=("armv7" "armv6")
BuildTypeLen=${#BuildTypeList[*]}

while [ "$2" != "-*" -a "$#" -gt 0 ]; do
    BuildTypeList["$BuildTypeLen"] = "$2"
    BuildTypeLen=${#BuildTypeList[*]}
    shift
done

我的目的是在运行时添加内容到BuildTypeList,而不是将其内容静态定义为源代码的一部分。


顺便说一下,原始代码无法工作的最直接原因是赋值符号周围的空格。foo=bar 是 shell 中的一个赋值;而 foo = bar 则不是。 - Charles Duffy
(另外,[ foo!= bar ]不是通配符表达式;需要使用bash扩展[[ ]]。) - Charles Duffy
3个回答

13

使用+=运算符向数组追加元素:

ary=( 1 2 3 )
for i in {10..15}; do
    ary+=($i)
done
echo "${ary[@]}" # => 1 2 3 10 11 12 13 14 15

3

更简单的方法是遍历所有参数,并有选择地将它们附加到您的列表中。

BuildTypeList=("armv7" "armv6")
first_arg=$1
shift;

for arg in "$@"; do
    [[ $arg != -* ]] && BuildTypeList+=( "$arg" )
done

# If you really need to make sure all the elements
# are shifted out of $@
shift $#

1
在将其附加到数组时,请确保引用"$arg" - glenn jackman

2

Bash 长期支持简单数组;bash 2.0 在 90 年代中期发布时就已经支持它们了。我希望没有人在使用不支持它们的版本。 - chepner
请不要将ABS作为文档来源建议——它已经过时,而且经常给出错误的建议。http://mywiki.wooledge.org/BashGuide是更受支持和维护的文档。 - Charles Duffy
@CharlesDuffy可能是这样,我只是从谷歌上选择了排名靠前的链接,主要是因为指向lmgtfy并不太有建设性。重点是有很多关于这个主题的资源。 - Qnan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接