我试过在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
它确实起作用了,但是你只回显了数组的第一个元素。使用这个代替:
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
#!/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
i=0 ... while [ $i -lt 5 ]; do ... let i=i+1 ... done
可以被替换为for ((i=0; i<5; ++i)); do ... done
。 - Super-intelligent Shade