2013-07-31 143 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突出顯示輸出。 –