2014-09-11 26 views
1

我瞎搞試圖從在zsh的字符串中的單引號的字,和明顯的事情儘量不工作,像這樣的:爲什麼此參數擴展以查找字符串中單引號的索引工作?

${foo[(i)']} 
${foo[(i)'']} 
${foo[(i)\']} 

當我試圖在命令行上的第一個,它促使我繼續與braceparam quote>,我跟着另一個單引號,然後再與braceparam>,我跟着另一個大括號。令我驚訝的是,這實際上給了正確的索引。所有連接在一起,這是什麼工作,以獲得第一個單引號的指標在一個字符串$foo

${foo[(i)']}'} 

真的很高興,我發現了一些作品,但任何人都可以解釋爲什麼它的工作原理?

編輯補充完整的例子:

foo="a 'bar' -l" 
echo ${foo[(i)']}'}      # echoes "3" 
echo ${foo[${foo[(i)']}'},${foo[(I)']}'}]} # echoes "'bar'" 
+0

你能給我們$ foo的內容嗎? – diogovk 2014-09-11 20:43:00

+0

@diogovk當然,我添加了一個有代表性的例子。 – wilywampa 2014-09-12 01:37:19

回答

2

編輯由chepner指出:

since (i) takes a pattern, ${foo[(i)[\']]} should and does work as expected. 

首先,̶這是怎麼了,我認爲你應該做的替代喜歡̶t̶h̶i̶s̶:̶

echo "${foo[(i)']}" 
#or 
echo "$foo[(i)']" 

現在,̶在我看來,你發現或者錯誤,或怪癖̶z̶s̶h̶.̶ 我不認爲這是由設計完成,但語法檢查不intepreting報價爲 替代品的單個字符,但作爲報價要完成。

奇怪的是,解析器正確地解釋了你的替換,當你把一個額外的}'

雖然它實際上忽略了它。你可以嘗試:

echo ${foo[(i)']}HiMomImOnTV'} 

令人驚訝的是,它的工作原理也是如此。

也許你應該打開一個錯誤報告,或詢問開發者郵件列表。

如果將雙引號置換替換,則語法檢查器不會發出抱怨,並且它可以正常工作。我認爲你應該添加它們,因爲你建議的表單(沒有雙引號)沒有記錄,並且行爲可能在未來版本的zsh中改變。

+0

引用擴展是在默認'zsh'設置下的一個趣味問題;不適用分詞或模式擴展。 +1,但。 – chepner 2014-09-12 19:19:55

+1

額外的數據點:因爲'(i)'有一個模式,'$ {foo [(i)[\']]}'應該並且按照預期工作。 – chepner 2014-09-12 19:31:08

+0

你完全正確! – diogovk 2014-09-12 19:50:34