2014-08-31 124 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