2016-02-25 43 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