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
相关产品推荐
相关产品推荐

