在 BASH 中回显输出结果的顺序不稳定

在 BASH 中回显输出结果的顺序不稳定

警告:我对 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'

相关内容