在bash中向数组添加元素

26

我试过在Bash中使用+=操作符追加数组,但不知道为什么它没有起作用。

#!/bin/bash

i=0
args=()
while [ $i -lt 5 ]; do
    args+=("${i}")
    echo "${args}"
    let i=i+1
done

期望的结果

0
0 1
0 1 2
0 1 2 3
0 1 2 3 4

实际结果

0
0
0
0
0

2
请看一下:http://www.shellcheck.net/ - Cyrus
3
它是有效的。然而,“echo "${args}"”只会显示第一个元素。你需要将其更改为“echo "${args[@]}"”,以输出所有元素。 - Super-intelligent Shade
1
略微偏题,但是 i=0 ... while [ $i -lt 5 ]; do ... let i=i+1 ... done 可以被替换为 for ((i=0; i<5; ++i)); do ... done - Super-intelligent Shade
可能是重复问题:扩展bash数组仅提供第一个元素 - wjandrea
2个回答

37

它确实起作用了,但是你只回显了数组的第一个元素。使用这个代替:

echo "${args[@]}"
Bash的数组语法很令人困惑。使用${args[@]}获取数组的所有元素,而使用${args}等同于${args[0]},获取第一个元素(索引为0)。请参阅ShellCheck展开未指定索引的数组只会得到第一个元素。另外,你也可以将let i=i+1简化为((i++)),但使用C风格的for循环更简单,同时在添加元素之前不需要定义args。因此,可采用以下方式:
#!/bin/bash
for ((i=0; i<5; ++i)); do
    args+=($i)
    echo "${args[@]}"
done

1
#!/bin/bash
for ((i=0; i<5; ++i)); do
  args+=($i)
  echo "${args[@]}"
done

$ ./run.sh "1 2 3" "4 5 6"
0
0 1
0 1 2
0 1 2 3
0 1 2 3 4

我觉得这更像是你在寻找的东西...

#! /bin/bash

for (( i = 1; i <= ${#@}; i++ ))
do
  args[${i}]="${!i}"
done

for (( i = 1; i <= ${#args[@]}; i++ ))
do
  echo "${args[${i}]}"
done

1 2 3
4 5 6

1
你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

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