我正在嘗試創建一個簡單的 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
)。