【问题标题】:bash incrementally adding to an arraybash 增量添加到数组
【发布时间】:2016-10-08 17:36:13
【问题描述】:

考虑下面的代码

#! /bin/bash

declare -a input # unnecessary
declare -a bad
declare -a good # unnecessary

input=('alpha 23' 'bravo 79' 'charlie 12')
echo "input is " ${#input[@]} "long"
for x in "${input[@]}"
do
    bad=$x
    good[ ${#good[@]} ]=$x
    echo 
    echo "added '$x', good is now " ${#good[@]} "long, bad is still " ${#bad[@]} "long"
done

输出是

input is  3 long

added 'alpha 23', good is now  1 long, bad is still  1 long

added 'bravo 79', good is now  2 long, bad is still  1 long

added 'charlie 12', good is now  3 long, bad is still  1 long

根据 bash 的手册页 ...“分配给索引数组时,如果提供了可选的括号和下标,则分配该索引;否则分配的元素的索引是最后一个索引由语句加一分配。索引从零开始。"

我显然不理解粗体部分,因为我希望语句“bad=$x”每次执行时都会自动增加索引。它没有并且每次都分配给 bad[0]。

为什么它没有达到我的预期,有没有比我分配给 good[ .. ] 的笨拙的代码更好的方法来编写代码

【问题讨论】:

标签: arrays bash indexing parameter-passing whitespace


【解决方案1】:

您引用的部分与分配有关,而不是添加:

array=([0]=zero [1]=one [2]=two)

等价于

array=([0]=zero one two)

其实是一样的

array=(zero one two)

要添加到数组,请使用+=

array+=(three)

【讨论】:

  • 现在更有意义了,谢谢。如果我将上面代码中的 bad=$x 替换为 bad+=("$x") 那么我会得到我想要的答案。
【解决方案2】:

choroba 已经回答了我的问题,正确的代码应该是

#! /bin/bash

input=('alpha 23' 'bravo 79' 'charlie 12')
echo "input is " ${#input[@]} "long"
for x in "${input[@]}"
do
    output+=("$x")
done

echo "output = (" ${output[@]} ") and is " ${#output[@]} " long "

如果参数中包含空格和其他难看的字符,这对于扫描和处理脚本的参数列表很有用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2021-06-21
    相关资源
    最近更新 更多