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)。

相关内容