Bashはすべての文字列に\ rを追加します。

Bashはすべての文字列に\ rを追加します。

単純な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)。

関連情報