(O+P)ut

OutPut Log by SE in SIer



(O+P)ut

Output Log by SE

【Bash】文字列を結合すると順番が崩れる不具合

スポンサーリンク

事象

abcde=$a$b$c$d$e
echo $abcde

とした場合に表示結果が想定と異なる。

コマンド実行環境
  • Debian GNU/Linux 9 (stretch)

考えられる原因

$a~$eのどれかに文末の制御コード「^M」が入りこんでいる。
確認方法はそれぞれを小分けにしてテキストファイルに出力し、制御コードを可視化した状態で確認する。

解決策

以下の記事にあるように想定外に入り込んだ改行コードを変換する。

$ nkf -Lu


以下、補足です。

補足


改行コードを表す「^M」が一文として取得時に入っているとどうなるのでしょうか。
例えば上の例で$dの末尾に「^M」が入っていると$eの後ろに「$d」が来る想定外の結果になってしまいます。

元のインプットファイルはwgetコマンドで取得したページなので中身をfileコマンドで確認すると

$ file input.txt
input.txt: UTF-8 Unicode text, with CRLF line terminators

となっていました。

それを以下のようにループ処理で切り出しながら$a~$eに格納するといった流れでしたが、line部分として文字列にすると明示的に「^M」が出現しました。

cat ./input.txt | while read line
do
...

同事象が発生した際、原因の切り分けに時間がかかったので備忘録として残しておきます。

ご参考になれば幸いです。


他の記事を読む