2014-08-31 85 views
0

根據man zshexpn(5.0.2):正確使用〜參數擴展標誌?

〜強制字符串參數以任何低於後面的括號內的標誌被視爲 模式。

例如,使用s標誌進行現場分裂需要一個字符串參數:

% print -l ${(s:9:):-"foo893bar923baz"} 
foo8 
3bar 
23baz 

我的~標誌的閱讀建議,我應該能夠代替文字的指定模式字符串分割,所以,下面的

% print -l ${(~s:<->:):-"foo893bar923baz"} 

應該產生

foo 
bar 
baz 

相反,它的行爲相同,如果我省略了~,根本不執行分割。

% print -l ${(s:<->:):-"foo893bar923baz"} 
foo893bar923baz 
% print -l ${(~s:<->:):-"foo893bar923baz"} 
foo893bar923baz 

回答

1

好,重讀的問題,它的這種區別:

$ val="foo???bar???baz" 
$ print -l ${(s.?.)val} 
foo 
bar 
baz 

而且這樣的:

$ val="foo???bar???baz" 
$ print -l ${(~s.?.)val} 
foo???bar???baz 

它運行在變,即 「論據」 的分裂(來自你的文檔報價)。在第一個例子中,我們用文字?來代替,在第二個例子中,我們把變量當作一個glob,並且沒有文字?,所以沒有東西被替換。

不過,雖然分裂適用​​於在替換操作本身的字符,而不是水珠,從documentation

s:string: 
    Force field splitting (see the option SH_WORD_SPLIT) at the separator string. 

因此,它並不像你可以在指令模式拆分。 ~字符修改要拆分的字符串的解釋。

另外,從您引用相同的模式擴展的文件,它continutes:

用〜括號外,這迫使被視爲一個圖案的整個 取代的字符串進行比較。 [[ "?" = ${(~j.|.)array} ]] 與EXTENDED_GLOB選項設置成功if和 僅當$ array包含字符串'?'作爲元素時。可以重複參數 以切換行爲;其效果只能持續到括號內組的結尾 。

${(~j.|.)array}${(j.|.)~array}之間的區別在於,前者治療中的值array作爲全球性的,後者對待結果作爲水珠。

參見:

${~spec}打開了規範的評價GLOB_SUBST選項;如果 「〜」加倍,則將其關閉。當設置此選項時,擴展產生的字符串 將被解釋爲可能的任何地方的模式 ,例如在文件名擴展和文件名 生成和模式匹配上下文(如 右邊的'='和'!='操作符。

這裏是一個演示,顯示的差異:

$ array=("foo???bar???baz" "foo???bar???buz") 
$ [[ "foo___bar___baz" = ${(~j.|.)array} ]] && echo true || echo false 
false 
$ [[ "foo___bar___baz" = ${(j.|.)~array} ]] && echo true || echo false 
true 

以及物品是否完整:

$ [[ "foo___bar___baz" = ${(~j.|.)~array} ]] && echo true || echo false 
true 
+0

我明白了's'標誌做了什麼;我在問''這個答案沒有解決的標誌。請重新閱讀這個問題。 '〜'和's'標誌一起出現在圓括號內*它不是在參數名稱前面出現的「〜」運算符(任何標誌之後)。 – chepner 2014-09-02 20:59:07

+0

更新回答,以包含'〜'標誌所做的事情。 – zerodiff 2014-09-02 21:45:53

+0

在文檔中這可能是錯誤的措辭,但我很確定'$ {(s.foo。)bar}中的參數是'foo',而不是'bar'。 – chepner 2014-09-03 13:10:26