Bash嵌套循环分割字符串遍历仅返回数组首元素问题排查
错误原因
Bash 数组遍历的语法写错了:直接用"$数组名"的形式引用数组时,只会返回数组的第一个元素,不会展开全部元素,这就是两层循环都只能拿到第一个值的根本原因:
- 外层循环
for val in "$hostsByType"实际只取到了${hostsByType[0]},也就是第一个逗号分隔的主机分组 - 内层循环
for host in "$hosts"实际只取到了${hosts[0]},也就是分组内第一个冒号分隔的IP地址
修正方案
Bash 遍历数组全部元素的标准写法是"${数组名[@]}",把两处循环的遍历对象改成这个写法即可,修正后的完整代码片段如下:
IFS=',' read -a hostsByType <<< "$1" # arg in format type1@ip1:ip2:,type2@ip3:, for val in "${hostsByType[@]}";do echo "$val" >> /logs/ansible-debug.log if [[ "$val" != "" ]];then IFS='@' read -a data <<< "$val" echo " ${data[0]}:" >> inventory.yml IFS=':' read -a hosts <<< "${data[1]}" c=1 for host in "${hosts[@]}";do echo "$host" >> /logs/ansible-debug.log if [[ "$host" != "" ]];then echo " host${c}: $host" >> inventory.yml c=$(($c + 1)) fi done fi done
运行效果
用示例入参type1@ip1:ip2:,type2@ip3:,测试时:
- ansible-debug.log会依次输出
type1@ip1:ip2:、ip1、ip2、type2@ip3:、ip3 - 生成的inventory.yml会包含两个分组,type1下有host1对应ip1、host2对应ip2,type2下有host1对应ip3,符合预期。
内容的提问来源于stack exchange,提问作者vaughngx4
相关产品推荐
相关产品推荐

