単純なLinux BASHスクリプトを作成しようとしていますが、bashがすべての文字列に\ rを追加し、 'tr'を使用して削除しようとすると、新しい文字列だけが追加されることに注意してください。これは私のスクリプトです。
#!/bin/bash
OUTFILE=$(echo -n `date +"%Y-%m-%d_%H-%m-%S"`)
ASD='DDD'
echo -n "DATE [$OUTFILE]"
echo -n "DDD [$ASD]"
これが出力です
bash -x backup-datadir.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_13-03-44
+ OUTFILE=$'2020-03-09_13-03-44\r'
+ ASD=$'DDD\r'
' echo -n 'DATE [2020-03-09_13-03-44
' echo -n 'DDD [DDD-03-44
追加の\ rがあるのはなぜですか? ]は改行文字の後に上書きされたため消えました。私はこれを前に見たことがありません...
答え1
\r
あなたのスクリプトはDOSテキストファイルです。つまり、各行の末尾にキャリッジリターン文字(通常は書かれています)が含まれています。 Unixテキストファイルにはこれはありません。Unixシステムがそのような文字を出力すると、カーソル位置が行の先頭に移動します。この行の追加出力は前の出力を上書きします。
スクリプトをUnixテキストファイルに変換すると問題が解決します。
$ bash -x script.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_21-03-47
+ OUTFILE=$'2020-03-09_21-03-47\r'
+ ASD=$'DDD\r'
' echo -n 'DATE [2020-03-09_21-03-47
' echo -n 'DDD [DDD-03-47
$ dos2unix script.sh
dos2unix: converting file script.sh to Unix format...
$ bash -x script.sh
+++ date +%Y-%m-%d_%H-%m-%S
++ echo -n 2020-03-09_21-03-03
+ OUTFILE=2020-03-09_21-03-03
+ ASD=DDD
+ echo -n 'DATE [2020-03-09_21-03-03]'
DATE [2020-03-09_21-03-03]+ echo -n 'DDD [DDD]'
DDD [DDD]
(使用のため、出力の最後の行の後に改行文字はありませんecho -n
)。
$ bash script.sh
DATE [2020-03-09_21-03-19]DDD [DDD]
(使用のため、出力の最後の行の後に改行文字はありませんecho -n
)。