2016-02-25 44 views
-1

我有一個列表,我想運行一個命令,所以我首先測試它與回聲,以確保它是正確的,但它打印出來是錯誤的。Bash替換字符串我不希望它

while read name; do echo $name; done < RandomNames 

此打印出來只是這個名單我究竟怎麼想,但如果我的變量後放任何東西它取代了它的開始。

所以,如果我寫

while read name; do echo $name; done < RandomNames 

它將打印

Rich 
Chris 
Zack 

,但如果我寫

while read name; do echo $name t; done < RandomNames 

寫入

tch 
tris 
tck 

因此它會將變量後面的前兩個字符替換掉,我不知道爲什麼。

+1

我無法複製這個運行您的最後一個命令。你確定這是你的bug的來源嗎? – dimo414

+0

未來,嘗試提供**完整**再現步驟,在這種情況下,從創建RandomNames文件開始。如果您嘗試測試以'printf'%s \ n'Rich Chris Zack> RandomNames'開始的再現步驟,然後運行您的命令,您很快就會注意到它並未真正重現您的問題,從而使其清晰該文件的內容不是你認爲的那樣。 –

+0

順便說一下,'echo $ foo'有它自己的錯誤; '回聲「$ foo」'避免它們。 (例如,看看'foo ='*''會發生什麼事情)。 –

回答

2

您的文件具有DOS換行符,因此每個輸入行以隱藏的$'\r'字符結尾,該行在打印行後將光標移動到行的開頭,以便下一個字符覆蓋該行的第一個字符。

可以使用dos2unix或類似的工具將它們轉換爲UNIX換行符,或者擴展${name%$'\r'}以修剪它們。

+0

這是問題謝謝你 – Rich