如何在Bash中按索引升序遍历数字数组并正确更新数组?
问题修复与解释
核心问题
你的代码存在两个关键问题:
- 循环遍历对象错误:
for i in ${array[@]}是遍历数组的元素值(即2、0、1),而非数组的索引(0、1、2),导致处理顺序和你期望的从索引0开始的顺序完全不符。 - 条件判断语法错误:
[[ "$array[$i]"="$count" ]]中=两边没有空格,会被解析为单一字符串(而非比较操作),且数值比较应使用-eq而非字符串比较的=,这会导致条件始终为真,不符合你的判断逻辑。
修复后的代码
以下两种方式都能实现按索引0→1→2的顺序遍历,并正确执行判断:
方式1:遍历数组索引
array=(2 0 1) tag=(H H H) count=0 # 使用 "${!array[@]}" 获取数组的所有索引,按顺序遍历 for i in "${!array[@]}" do # 用 -eq 做数值比较,且两边保留空格 if [[ "${array[$i]}" -eq "$count" ]] then array[$i]=$((array[$i] + 1)) tag[$i]="C" fi count=$((count + 1)) done
方式2:C风格循环
array=(2 0 1) tag=(H H H) count=0 # 从索引0开始,遍历到数组最后一个索引 for ((i=0; i<${#array[@]}; i++)) do if [[ "${array[$i]}" -eq "$count" ]] then array[$i]=$((array[$i] + 1)) tag[$i]="C" fi count=$((count + 1)) done
关键细节说明
"${!array[@]}":返回数组的所有索引,对于长度为3的数组,会依次返回0、1、2,保证按升序处理索引。${#array[@]}:获取数组的元素个数,C风格循环通过i从0递增到数组长度-1,同样实现索引升序遍历。-eq:用于数值比较,适合整数之间的判断;如果用=则是字符串比较,可能在数值位数不同时出现错误(比如"10"和"010"字符串比较不相等,但数值相等)。[[ ]]中的比较操作必须在运算符两边保留空格,否则会被解析为字符串赋值或无效表达式。
内容的提问来源于stack exchange,提问作者Ifeoma
相关产品推荐
相关产品推荐

