2013-07-31 89 views
3

我有它的Mercurial库列表的文本文件,格式如下:猛砸连接字符串不正确

IDE 
Install 
InstallShield 

我正在写一个bash脚本克隆/拉/更新基础上的所有信息库文本文件。现在我只是在做任何实际的克隆之前回应。如果我做的:

while read line; do 
    echo "hg clone" ${MASTER_HG}/${line}; 
done < Repos.txt 

的输出为预期:

hg clone /media/fs02/IDE 
hg clone /media/fs02/Install 
hg clone /media/fs02/InstallShield 

但是,如果我这样做:

while read line; do 
    echo "hg clone" ${MASTER_HG}/${line} ${REPOROOT}/${line}; 
done < Repos.txt 

输出是:

/var/hg/repos/IDE02/IDE 
/var/hg/repos/Installnstall 
/var/hg/repos/InstallShieldShield 

似乎将字符串的开始替换为结尾字符串。是否有某种字符溢出或发生了什么?我很抱歉,如果这是一个愚蠢的问题,但我是bash的相对noob。

+2

回车? CRLF在Repos.txt中结束? –

+4

CRLF是万恶的新平方根。 – devnull

+1

+1对于“一个相对noob”与一些实际的代码。 – devnull

回答

6

你的文件有DOS行尾; $line末尾的\r会导致光标返回到行的开头,这只会影响您的输出,因为$line不是在换行符之前打印的最后一个东西。你应该删除它们,像dos2unix


您可以使用类似Perl的chomp命令删除一个后回车,如果存在:

# $'\r' is bash-only, but easy to type. For POSIX shell, you'll need to find 
# someway of entering ASCII character 13; perhaps Control-V Control-M 
line=${line%$'\r'} 

有用的,如果出于某种原因,你不能(或不要”不想在读取之前修正输入。

+1

好悲伤。你是对的。谢谢!我应该注意到编辑器底部的dos标志。我很尴尬地说,这难倒了我多久。 –

+1

@ChrisBush我相信至少有一次发生在我们所有人身上。 – SethMMorton

1

从外观上看,${REPOROOT}可能已经包含${line},请尝试自己回应${REPOROOT},看看你得到了什么。

+0

感谢您的回答。原来是像chepner建议的DOS类似的回车。 –

+1

啊,我现在看到了。我在编辑格式之前编写了我的答案,所以我没有注意到某些字符丢失了,而不是简单地重复'$ {line}'值...大写i = I!= l =小写L – CDspace

+0

那是我的错。感谢Ruben突出显示输出。 –