BASHのエコー出力結果の順序が不安定です。

BASHのエコー出力結果の順序が不安定です。

警告:私はBASHスクリプトに初めて触れたので、ハッキングされたスクリプトに関するアドバイスをいただきありがとうございます。

奇妙な問題があります。私のコードでは、1つの配列のファイルから複数のエラー文字列を収集し、2番目の配列はエラー数を同じインデックスに格納します(2D配列がないため、これを行いました。実際に行列を作成したくありませんでした)。

コードを出力するときは、次の行を使用してください。

for ((i=0; i<${#NAME_ARRAY[@]}; i++)); do
   echo "Error: ${NAME_ARRAY[$i]} x ${COUNT_ARRAY[$i]}"
done

この場合、テストには2つの別々のファイルを使用しており、ファイル1で実行すると、次の出力が表示されます。

エラー:例外:不明または登録されていないファイル形式:x 72982

これは素晴らしい、うまく機能し、正確に期待どおりに機能します。巨大なログファイルに1つのエラー(「例外:不明/未登録ファイル形式:」)があり、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]}"

私のアマチュアの考えは、これが2つの出力を分離すると思いましたが(すべての種類のスレッド/優先順位の問題の場合)、残念ながらまだ同じ結果が得られました。

私は非常に明確なものを見逃していますか?それとも、私のエコーが何か奇妙なことをしているようです。

私はechoの代わりにprintfを使ってテストしましたが、同じことが起こりました。コンソールに印刷するときに何らかの文字エンコーディングの問題がある可能性がありますか?

答え1

「ある種のディスクI / Oエラーが発生しました。」メッセージ\rの末尾に文字が含まれる可能性が高いです。これにより、カーソルが現在の行の先頭にリセットされ、「x 66964」の次の出力が行の先頭を上書きします。この問題を解決するには、パイピングなどで$ NAME_ARRAYに読み込むときにキャリッジリターンを削除する必要がありますtr -d '\r'

関連情報