Bashスクリプトはawkにドル記号と\ rを印刷します。

Bashスクリプトはawkにドル記号と\ rを印刷します。

私はcat'ingとawkを使っていくつかの変数を取得するbashスクリプトを持っています。最初のものはうまくいきますが、2番目のものは前に$と末尾の\ r ...アイデアがありますか?

#!/bin/bash
newTS=$( cat times.txt | awk -F';' '{print $2}')
ctime=$( cat times.txt | awk -F';' '{print $3}')
 echo 'nextTime='$newTS
 echo 'currentTime='$ctime

echo コマンドによって発生する理由

+ echo $'currentTime=2020-04-21T12:36:14\r'

最初のawkはどこにありますか?

+ echo nextTime=2020-04-21T11:46:11

引用符または変数拡張が必要ですか?

これは私のtimes.txtファイルです。

2020-04-21T11:45:11;2020-04-21T11:46:11;2020-04-21T12:36:14

答え1

入力ファイルはDOSテキストファイルです。これは、Unixツールが各行に表示する最後の文字がキャリッジリターン(通常はキャリッジリターンとして書き込まれる\r)であることを意味します。

これは行の3番目のフィールドの一部であるため、2番目の\rプログラムの出力から取得できます。awk2 番目のフィールドが行末にないため、2 番目のフィールドにはありません。したがって、最初のプログラムはここに含まれる文字列をawk生成しません。\r

これを使用してスクリプトを実行することもできますbash -x。これにより、シェルで出力を追跡(デバッグ)できます。シェルが特殊文字(キャリッジリターンなど)を含むコマンドトレースを出力すると、シェル(?)は関連する文字列を「C文字列」、つまり$'...'

dos2unixたとえば、次のように入力データファイルをUnixテキストファイルに変換します。

関連情報