Bash脚本嵌套双循环遍历数组输出异常该如何解决
问题根因
核心错误为循环变量名与数组名完全重复,Bash 中普通变量与数组共享同一作用域的命名空间,不存在变量类型隔离:
- 外层循环启动时已经读取了
region数组的全量值做迭代,所以即使循环过程中region数组被同名循环变量覆盖为字符串,外层遍历逻辑不受影响 - 第一次内层循环执行时,初始
env数组会被同名循环变量逐步覆盖,第一次内层循环结束后,env最终被赋值为字符串stage,原env数组已被销毁 - 第二次外层循环进入内层时,
"${env[@]}"实际是读取字符串stage的数组形式,仅包含1个值,因此只会输出stage
修复方案
只要将循环变量修改为和数组不重名的名称即可,也可以顺便将数组名调整为复数形式降低命名冲突概率,参考修复代码如下:
#!/bin/bash # 数组名用复数形式更符合语义,也避免和单值变量重名 regions=('us-east-1' 'eu-central-1') envs=('prod' 'stage') for reg in "${regions[@]}" do for curr_env in "${envs[@]}" do echo "$reg" echo "$curr_env" done done
如果不想修改原数组名,仅修改循环变量也可正常运行:
#!/bin/bash region=('us-east-1' 'eu-central-1') env=('prod' 'stage') for r in "${region[@]}" do for e in "${env[@]}" do echo "$r" echo "$e" done done
内容的提问来源于stack exchange,提问作者Devops-Learner
相关产品推荐
相关产品推荐

