【问题标题】:Appending argv entries to an array (dynamically populating an array) in bash在 bash 中将 argv 条目附加到数组(动态填充数组)
【发布时间】:2012-08-21 17:29:57
【问题描述】:

我正在尝试将参数列表 ("$@") 中的内容(不包括 $1 以及任何以破折号开头的值)附加到 bash 中的数组。

我当前的代码如下,但运行不正确:

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

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

我的意图是在运行时向BuildTypeList 添加内容,而不是将其内容静态定义为源的一部分。

【问题讨论】:

  • 顺便说一句,原始代码不起作用的最直接原因是分配中= 符号周围的空格。 foo=bar 是 shell 中的赋值; foo = bar 不是。
  • (另外,[ foo != bar ] 不是 glob 表达式;为此需要 bash 扩展名 [[ ]])。

标签: arrays bash shell dynamic


【解决方案1】:

使用+= 运算符附加到数组:

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

【讨论】:

    【解决方案2】:

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

    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 $#
    

    【讨论】:

    • 确保在将 "$arg" 附加到数组时引用它。
    【解决方案3】:

    【讨论】:

    • Bash 支持简单数组已经很长时间了; 90 年代中期发布的 bash 2.0 支持它们。我希望没有人使用不使用的版本。
    • 请不要建议将 ABS 作为文档来源——它已经过时并且经常提供完全错误的建议。 mywiki.wooledge.org/BashGuide 得到更积极的支持和维护。
    • @CharlesDuffy 可能是,我刚刚从 Google 选择了顶部链接,主要是因为指向 lmgtfy 不太有建设性。关键是这个主题有很多资源。
    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2017-05-20
    • 2015-08-15
    • 2012-02-09
    • 2012-04-16
    • 2011-03-06
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多