2015-01-15 97 views
0

我想連接兩個字符串從用戶輸入。這些是「要尋找的東西」和「要替換的東西」。它最終將成爲構建過程的一部分。我似乎無法得到正確連接的變量。這裏的腳本:Bash腳本不連接字符串

#!/bin/bash 
first=${1} 
second=${2} 
TO_REPLACE="Hello Kitties=$first" 
REPLACEMENT="Hello Kitties=$second" 
echo $TO_REPLACE 
echo "s/${TO_REPLACE}/${REPLACEMENT}/g" 
sed -i "s/${TO_REPLACE}/${REPLACEMENT}/g" "C:\\Test\\Mah.config" 

我把回聲在那裏與firstsecond變量來解決一起。我得到的結果是這樣的:

[email protected] ~ 
$ bash C:\\Users\\mrhoden\\workspace\\Test\\Concatenation.sh Yes No 
Hello Kitties=Yes 
/gello Kitties=Noes 

我不明白爲什麼第一個工作正常,但不是第二個。我甚至考慮過/,但是當我用l或任何其他角色替換它時,我獲得的結果基本相同。我嘗試過將變量分組和變量的各種方式。我甚至使用ShellEdge插件下載和使用eclipse,以防Windows和基於Unix的編輯器(之前的Notepad ++)之間出現一些奇怪的交互。

我很茫然,任何幫助將不勝感激。

+1

似乎來自MSWin行結尾的'$'\ r''進入了一個字符串。 – choroba 2015-01-15 15:32:25

+2

'dos2unix文件'。祝你好運。 – shellter 2015-01-15 15:49:12

回答

2

看起來你的腳本文件是DOS/Windows格式(在每行尾部用回車符跟着換行符)而不是unix格式(在每行末尾用換行符)。當shell執行它時,它會將回車(有時寫爲\r)作爲命令的一部分。例如:first=${1}\r$first設置爲第一個參數,並附加回車符。然後TO_REPLACE="Hello Kitties=$first"\r$TO_REPLACE到那個,與另一個回車釘結束。因此,當你到第二回聲,它實際上做的是:

echo "s/Hello Kitties=Yes\r\r/Hello Kitties=No\r\r/g"\r 

當這種打印,每個回車使終端回到行的開始,所以它本質上打印三件事情,每個上最後的頂部:

s/Hello Kitties=Yes 
/Hello Kitties=No 
/g 

讓你有合併的混亂:

/gello Kitties=Noes 

解決方案:爲@shellter建議,使用dos2unix轉換腳本以unix格式,然後粘貼到腳本的unix風格的文本編輯器。

+0

感謝您的全面解釋,它終於有道理。如果有人出現並找到它,你必須重新安裝cygwin,並在utils下查找dos2unix包。 – 2015-01-15 16:41:44

+0

在看到這個答案之前,我完全糊塗了。優秀的解釋!感謝您爲我節省了5個小時! – mshsayem 2016-08-03 04:37:38