You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:36:02