![在 BASH 中回显输出结果的顺序不稳定](https://linux22.com/image/73031/%E5%9C%A8%20BASH%20%E4%B8%AD%E5%9B%9E%E6%98%BE%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C%E7%9A%84%E9%A1%BA%E5%BA%8F%E4%B8%8D%E7%A8%B3%E5%AE%9A.png)
警告:我对 BASH 脚本编写相对较新,因此任何有关我的 hacky 脚本编写的建议都值得赞赏。
我有一个奇怪的问题,在我的代码中,我从一个数组中的文件中收集了一堆错误字符串,第二个数组将错误计数存储在同一索引中(鉴于缺乏二维数组,我这样做了,并且并不想真正建立一个矩阵)。
输出代码时我使用这一行:
for ((i=0; i<${#NAME_ARRAY[@]}; i++)); do
echo "Error: ${NAME_ARRAY[$i]} x ${COUNT_ARRAY[$i]}"
done
在这种情况下,我正在使用两个单独的文件进行测试,如果我在文件一上运行它,我会得到以下输出:
错误:异常:未知/未注册的文件格式:x 72982
这很酷,工作正常并且完全符合预期。我知道在巨大的日志文件中只有一个错误(“异常:未知/未注册的文件格式:”),并且它出现了 72982 次。
但在我的其他情况下,我得到这个结果:
x 66964xception:发生某种磁盘 I/O 错误
这就是我完全迷失的地方。如果我单独打印 ${NAME_ARRAY[$i]} ,我会得到“发生某种磁盘 I/O 错误”,完全没问题。同样,如果我单独打印 ${COUNT_ARRAY[$i]} ,我会得到“66964”...但是当我将它们都放入字符串中时,COUNT_ARRAY 数字会被扔到字符串的开头并覆盖“错误: “ 部分。
考虑到我可能有点聪明,但又很老套,我决定这样做:
echo -n "Error: ${NAME_ARRAY[$i]}"
echo " x ${COUNT_ARRAY[$i]}"
我的业余想法认为这会分离两个输出(以防出现任何类型的线程/优先级问题),但可惜的是,我仍然得到完全相同的结果。
我是否遗漏了一些非常明显的东西?或者我的回声正在做一些奇怪的事情。
我也刚刚使用 printf 而不是 echo 进行了测试,同样的事情发生了。打印到控制台时是否可能存在某种字符编码问题?
答案1
“发生某种磁盘 I/O 错误”消息很可能\r
在末尾包含一个字符。这会将光标重置到当前行的开头,导致接下来输出的“x 66964”覆盖该行的开头。要修复它,您需要在将其读入 $NAME_ARRAY 时去掉回车符,例如通过管道传输tr -d '\r'
。