我有一个文本文件,其中包含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的亲戚。
答案 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}
,看看你得到了什么。