bash逐步添加到数组

时间:2016-10-08 17:36:13

标签: arrays bash indexing parameter-passing whitespace

考虑以下代码

#! /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的man-page ...“当分配给索引数组时,如果提供了可选的括号和下标,则指定该索引; 否则分配的元素的索引是最后一个索引分配给语句加一个。索引从零开始。“

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

为什么它没有按照我的预期进行,是否有更好的编写代码的方式,而不是我指定给好的[...]

的笨拙的行

2 个答案:

答案 0 :(得分:2)

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

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

相当于

array=([0]=zero one two)

实际上与

相同
array=(zero one two)

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

array+=(three)

答案 1 :(得分:0)

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 "

如果参数中包含空格和其他笨拙的字符,那么扫描和处理脚本的参数列表非常有用