2014-05-07 57 views
3

我有兩個相同的Ubuntu 12.04 LTS系統。今天,在其中一個Ubuntu系統上,shell腳本失敗了,儘管它已經有多年沒有修改過了,並且在幾個小時前就開始工作了。我能夠縮小到這個錯誤:沒有理由的shell腳本問題

string='question mark: ?' 
echo $string 
question mark: n t 

string='question mark: ?' 
echo "$string" 
question mark: ? 

在shell腳本失敗的系統上,'?'在省略引號時用'n t'代替。這是其他相同系統上的相同測試的結果:

string='question mark: ?' 
echo $string 
question mark: ? 

string='question mark: ?' 
echo "$string" 
question mark: ? 

在這個系統中的問號被正確打印,不管引號省略或不。

shell腳本多年來一直未被修改,系統也沒有以任何方式升級或修改。 shell腳本幾個小時前工作,但突然失敗,因爲'?'轉換爲'n t',原因不明。

因爲這個,我瘋了,所以我真的很希望有人知道爲什麼會發生這種情況。

謝謝。

回答

8

這是因爲您的工作目錄中有文件nt?被任何帶有一個字符的文件取代。

$ ls 
a t myfile 

$ echo $string 
question mark: a t 

爲了解決這個問題,當echo ING雙引號你的變量:

$ echo "$string" 
question mark: ? 

在一般情況下,devnull評論中Why does bash 「echo [t]」 result in 「t」 not 「[t]」

Shell Command Language 告訴以下字符是特別的殼dependi NG 在上下文:

* ? [ # ~ = % 

而且,如果他們是代表 以下字符必須進行引用自己:

| & ; < > () $ ` \ " ' <space> <tab> <newline> 

因此,對於具有*例如,你得到的所有文件:

$ string='question mark: *' 

$ echo $string 
question mark: a myfile t 
+1

我不能夠感謝你。這是問題的原因。幾個小時前,我在我的主目錄中創建了兩個名爲'n'和't'的文件夾。現在是我閱讀特殊字符以避免將來出現這些問題的時候了。 – user3611207

+1

一般來說,你應該引用任何使用雙引號的shell變量,就是這樣。只有在極少數情況下,如果你想要像你偶然發現的效果那樣,就把引號留下;我通常會對這些案例發表評論,以解釋爲什麼這些報價一度被廢除。 – Alfe