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

Bash数组my_interface_nr无法显示全部元素的问题求助

问题原因分析

核心问题出在你用了 docker exec -it 来执行非交互式命令!-it 参数是用来启动交互式终端会话的,它会给容器分配一个伪TTY(虚拟终端)。在脚本这种非交互式环境下,这个伪TTY会直接干扰命令输出的捕获逻辑:

  • 它可能在输出中插入额外的控制字符、换行符,甚至打乱输出顺序
  • 循环里多次调用 -it 命令,还会导致终端环境混乱,使得后续命令的输出无法被正确重定向到变量中

这就是为什么替换成固定字符串 "new" 时数组工作正常——没有终端交互的干扰,赋值逻辑完全不受影响。

解决方案

把 docker exec 里的 -it 参数去掉(如果你的命令需要读取标准输入,可保留 -i,但这里 cat 命令完全不需要),改用非交互式方式执行命令。

另外,你当前脚本里重复执行了两次 docker exec(一次打印、一次存数组),可以优化成先把结果存入变量,再同时完成打印和数组赋值,减少Docker调用次数,提升效率。

修改后的脚本如下:

my_interface_nr=(); 
for container in $(sudo docker ps -q); do 
    # 获取容器名称
    container_name=$(sudo docker inspect --format='{{.Name}}' "$container")
    echo "$container_name"
    
    # 非交互式执行命令,获取iflink值并存入变量
    iflink=$(sudo docker exec "$container" cat /sys/class/net/eth1/iflink)
    echo "$iflink"
    
    # 将值加入数组
    my_interface_nr+=( "$iflink" )
done 

# 数组测试部分优化,适配任意长度数组
echo "------------ARRAY TEST -----------------" 
echo "${my_interface_nr[@]}" 
echo "${my_interface_nr[*]}" 
echo "------------INDICES OF ARRAY-----------" 
echo "${!my_interface_nr[@]}" 
echo "------------SIZE OF ARRAY--------------" 
echo "${#my_interface_nr[@]}" 
echo "------------ELEMENTS OF ARRAY----------" 
for idx in "${!my_interface_nr[@]}"; do
    echo "my_interface_nr[$idx] = ${my_interface_nr[$idx]}"
done
额外优化说明
  • 给变量和容器ID加上双引号(比如 "$container"),可以避免容器ID包含特殊字符时出现解析错误
  • 最后遍历数组的方式比逐个索引打印更通用,不管数组长度多少都能正确输出所有元素

修改后再执行脚本,数组就能正确存储每个容器的eth1网卡iflink值,echo "${my_interface_nr[@]}"也会正常显示全部元素了。

内容的提问来源于stack exchange,提问作者arek121281

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 14:07:39