如何在Bash中将Docker查询结果每行设为变量并遍历IP执行DNS查询
实现步骤
推荐方案:使用数组存储行数据(更适合后续批量处理)
Shell 数组是处理多行输出的最优选择,不需要手动声明多个独立变量,遍历和取值都更便捷。
第一步:将docker命令输出按行存入数组
执行以下命令即可将每行结果按顺序存入 container_lines 数组:
mapfile -t container_lines < <(sudo docker ps -q | xargs -n 1 sudo docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##')
参数说明:
mapfile -t会自动按换行拆分输入,同时去掉每行末尾的换行符- 数组下标从0开始,
${container_lines[0]}对应第一行输出、${container_lines[1]}对应第二行,以此类推,和你需要的$var1/$var2仅下标差1
第二步:遍历数组提取IP执行DNS查询
直接用双层循环即可完成IP提取和查询操作:
for line in "${container_lines[@]}"; do # 拆分当前行:第一个字段为容器名,剩余字段全部为IP read -r container_name *all_ips <<< "$line" echo "===== 处理容器: $container_name =====" for ip in "${all_ips[@]}"; do # 跳过空IP(避免行尾空格产生的无效空值) [ -z "$ip" ] && continue echo "查询IP: $ip" # 此处可替换为你需要的DNS查询命令,比如dig、host等 nslookup "$ip" echo "--------------------------" done done
备选方案:生成独立变量$var1、$var2...
如果你的场景必须要使用独立命名的变量,可以按照以下方式实现:
# 先将输出存入临时数组 mapfile -t temp_lines < <(sudo docker ps -q | xargs -n 1 sudo docker inspect --format '{{ .Name }} {{range .NetworkSettings.Networks}} {{.IPAddress}}{{end}}' | sed 's#^/##') # 循环生成var1、var2...变量 for idx in "${!temp_lines[@]}"; do declare "var$((idx+1))=${temp_lines[$idx]}" done
生成后你可以直接调用$var1、$var2获取对应行的内容。
如果要提取单个变量里的IP做查询,以$var1为例:
# 拆分var1的内容,跳过容器名字段,提取所有IP read -r _ *ips <<< "$var1" for ip in "${ips[@]}"; do [ -z "$ip" ] && continue # 执行DNS查询,示例用反向查询 dig -x "$ip" +short done
注意事项
- 以上语法仅适用于Bash 4.0及以上版本
- 若无运行中的Docker容器,数组和变量都不会生成值
- DNS查询命令可根据需求自行替换调整
内容的提问来源于stack exchange,提问作者Jim Lahey
相关产品推荐
相关产品推荐

