私は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
プログラムの出力から取得できます。awk
2 番目のフィールドが行末にないため、2 番目のフィールドにはありません。したがって、最初のプログラムはここに含まれる文字列をawk
生成しません。\r
これを使用してスクリプトを実行することもできますbash -x
。これにより、シェルで出力を追跡(デバッグ)できます。シェルが特殊文字(キャリッジリターンなど)を含むコマンドトレースを出力すると、シェル(?)は関連する文字列を「C文字列」、つまり$'...'
。
dos2unix
たとえば、次のように入力データファイルをUnixテキストファイルに変換します。