Bash数组循环处理问题:无法正确获取var实际值,求修正
Bash脚本数组遍历问题修复方案
问题描述
遍历数组bazel_paths_array时,无法正确获取当前元素值,输出a[0]这类错误格式;需要实现每次循环将数组中一个元素设为var,剩余元素组成排除该元素的集合,用于bazel coverage命令。
原脚本
bazel_paths_array=(a b c d) for ele in "${!bazel_paths_array[@]}" do b=("${bazel_paths_array[@]}") unset b[$ele] echo "${b[@]}" if [[ ! "${na2[*]}" =~ "$abp" ]] then var=$bazel_paths_array["${abp}"] fi na2="${b[*]}" printf "var to run bazel on: %s " "${var}" printf "new array to skip bazel on: %s " "${na2}" #bazel coverage "$var" "${na2[*]}" done
当前错误输出
b c d var to run bazel on: a[0] new array to skip bazel on: b c d a c d var to run bazel on: a[1] new array to skip bazel on: a c d a b d var to run bazel on: a[2] new array to skip bazel on: a b d a b c var to run bazel on: a[3] new array to skip bazel on: a b c
期望输出
length of bazel paths array is 4: b c d var to run bazel on: a new array to skip bazel on: b c d a c d var to run bazel on: b new array to skip bazel on: a c d a b d var to run bazel on: c new array to skip bazel on: a b d a b c var to run bazel on: d new array to skip bazel on: a b c
问题根源
- 数组取值语法错误:原脚本中
var=$bazel_paths_array["${abp}"],Bash中数组元素必须用${数组名[索引]}格式取值,直接写$数组名[索引]会被解析为字符串拼接,加上abp变量未定义,最终输出a[0]这类错误结果。 - 无效逻辑判断:
if [[ ! "${na2[*]}" =~ "$abp" ]]完全多余,abp未定义、na2初始为空,该判断无法起到任何作用。
修正后的脚本
bazel_paths_array=(a b c d) echo "length of bazel paths array is ${#bazel_paths_array[@]}:" echo for ele in "${!bazel_paths_array[@]}" do # 复制原数组到临时数组 b=("${bazel_paths_array[@]}") # 删除当前循环索引对应的元素 unset b[$ele] # 直接通过当前索引获取目标元素 var="${bazel_paths_array[$ele]}" # 剩余元素保持数组类型(避免含空格元素出错) na2=("${b[@]}") # 打印调试信息 echo "${b[@]}" printf "var to run bazel on: %s\n" "$var" printf "new array to skip bazel on: %s\n\n" "${na2[*]}" # 启用bazel命令时取消注释 # bazel coverage "$var" "${na2[@]}" done
修正后输出
length of bazel paths array is 4: b c d var to run bazel on: a new array to skip bazel on: b c d a c d var to run bazel on: b new array to skip bazel on: a c d a b d var to run bazel on: c new array to skip bazel on: a b d a b c var to run bazel on: d new array to skip bazel on: a b c
修改说明
- 添加数组长度打印,匹配期望输出格式。
- 移除无效的
if判断,直接通过循环索引$ele获取对应数组元素,确保var值正确。 - 将
na2定义为数组类型,后续使用${na2[@]}传递参数更稳妥(避免元素包含空格时出现拆分错误)。 - 调整输出格式,与期望结果完全对齐。
内容的提问来源于stack exchange,提问作者AhmFM
相关产品推荐
相关产品推荐

