Bash数组按4步长迭代索引异常问题求助
问题诊断与修复
你遇到的问题根源在于数组索引的算术运算写法错误,误用了Bash的参数扩展语法代替算术求值。
问题分析
在你的循环代码中,像${dnsAry[${j+1}]}这样的写法是错误的:
${j+1}是Bash的参数扩展语法(${parameter+word}),它的含义是:如果变量j已被设置(无论值是否为空),就返回word(这里是1),否则返回空。- 所以当
j=4时,${j+1}会返回字符串1,而不是你期望的4+1=5;同理${j+3}会返回3,而不是7——这就是为什么第二次循环里索引7的位置错误地取到了索引3的元素。
正确的写法应该是用$((j+1))来进行算术求值,这样才能得到j加1的数值结果作为数组索引。
修正后的代码
把循环里的数组索引部分修改为算术求值的形式:
#!/bin/bash # Run as - /tmp/dns.sh qa aqa api envType=$1 clusterType=$2 projectName=$3 declare -a dnsAry if [[ "${envType}" =~ "ci" ]]; then dnsAry+=("dev.example.com") dnsAry+=("${envType}-${projectName}") dnsAry+=("${clusterType}-${projectName}") dnsAry+=("${envType}-${projectName}-app-and-web-dns") fi if [[ "${envType}" =~ "qa" ]]; then dnsAry+=("dev.example.com") dnsAry+=("${envType}-${projectName}") dnsAry+=("${clusterType}-${projectName}") dnsAry+=("${envType}-${projectName}-app-dns") dnsAry+=("qa.example.com") dnsAry+=("${envType}-${projectName}") dnsAry+=("${clusterType}-${projectName}") dnsAry+=("${envType}-${projectName}-web-dns") fi echo -e "Array size : ${#dnsAry[@]}" echo -e "Array content : ${dnsAry[@]}" for (( j = 0; j < "${#dnsAry[@]}"; j+=4 )) do echo -e "Loop content $((j)) : ${dnsAry[$j]}" echo -e "Loop content $((j + 1)) : ${dnsAry[$((j+1))]}" echo -e "Loop content $((j + 2)) : ${dnsAry[$((j+2))]}" echo -e "Loop content $((j + 3)) : ${dnsAry[$((j+3))]}" done
验证结果
运行修正后的代码,输出会和你的期望完全一致:
/tmp/dns.sh qa aqa hapi Array size : 8 Array content : dev.example.com qa-hapi aqa-hapi qa-hapi-app-dns qa.example.com qa-hapi aqa-hapi qa-hapi-web-dns Loop content 0 : dev.example.com Loop content 1 : qa-hapi Loop content 2 : aqa-hapi Loop content 3 : qa-hapi-app-dns Loop content 4 : qa.example.com Loop content 5 : qa-hapi Loop content 6 : aqa-hapi Loop content 7 : qa-hapi-web-dns
额外小提示
你也可以简化循环里的写法,比如先把当前块的起始索引赋值给一个变量,或者用更清晰的方式拆分数组块,不过当前的修正已经能解决核心问题啦。
内容的提问来源于stack exchange,提问作者Theo Sweeny
相关产品推荐
相关产品推荐

