Bash连接字符串不正确

时间:2013-07-31 20:43:50

标签: bash

我有一个文本文件,其中包含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的亲戚。

2 个答案:

答案 0 :(得分:6)

您的文件有DOS行结尾; \r末尾的$line会导致光标返回到行的开头,这只会影响您的输出,$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 :(得分:1)

从它的外观来看,${REPOROOT}可能已包含${line},请尝试单独回显${REPOROOT},看看你得到了什么。