Zsh 为什么在字符串中查找单引号索引的参数扩展有效?

Zsh 为什么在字符串中查找单引号索引的参数扩展有效?,zsh,Zsh,我在尝试从zsh中的字符串中提取一个带引号的单词,但显然没有成功,例如: ${foo[(i)']} ${foo[(i)'']} ${foo[(i)\']} 当我在命令行上尝试第一个时,它提示我使用braceparam quote>继续该行,之后是另一个单引号,然后再次使用braceparam>,之后是另一个右大括号。令我惊讶的是,这实际上给出了正确的索引。所有这些结合在一起,就可以得到字符串中第一个单引号的索引$foo: ${foo[(i)']}'} 很高兴我发现了一些有效的东西,但是有人能

我在尝试从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'"

正如切普纳所指出的:

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

7.Fα,Fαα,Fα,Fα,iγ,Fα,Fα,Fα,Fα,Fα,iα,iα,Fα,iα,iα,iα,iα,iα,iα,我,iγ,rγ,rα,rγ,rα,rα,sαα,rα,rα,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ,γ8.0 0,0.0,0.0,0.0 0,0.0,0.0,0.0,0.0 0,0.0 0,0.0,0.0,0.0,0,0 0 0,0 0 0,0 0 0,0 0,0,0,t,t,t,t,t,t,t,t,t,h,h̶h,h,h,e,e?本本本本研究研究,以及以及以及其他其他其他其他其他的研究研究,本本本本本本本本本本本研究的研究,以及以及以及以及本本本本研究的研究的研究,是是,本本本本本研究的城市城市的研究的研究,以及以及以及以及本本本本研究的开展开展开展开展开展开展开展开展开展开展开展开展开展的,本本本本本研究,本研究,本本本研究,本研究,本研究,本研究的开展开展开展开展开展开展开展开展开展的e,t,h,i,s:"

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

本研究的目的是,对本研究的开展,以及对本研究的开展,以及对本研究的开展,以及对本研究的开展,以及对本研究的开展,以及对本研究的开展,以及对本本研究的城市,以及以及以及以及其他其他维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维维,以及以及以及其他其他维维维维维维维维维,以及以及以及以及其他其他其他,以及以及以及以及以及以及其他其他其他维维维维维维维,以及以及以及以及其他其他其他其他,本本本本本研究研究的,以及以及以及以及以及以及以及以及以及以及以及其他其他其他其他其他其他其他,本本本本研究研究的研究,本本本研究,以及以及本本研究研究的研究,以及以及以及以及以及以及本本本本本研究的研究研究的研究,本本本本本研究的研究的研究,本本本研究,本本研究的研究,本研究的研究̶e̶i̶t̶h̶e̶r̶a̶b̶u̶g̶o̶r̶a̶q̶u̶i̶r̶k̶o̶f̶z̶s̶ 我不认为这是设计完成的,但语法检查器并没有将引号解释为 替换,但作为待完成的报价

奇怪的是,当您添加一个额外的}时,解析器正确地解释了您的替换

尽管它实际上忽略了它。实际上,您可以尝试:

echo ${foo[(i)']}HiMomImOnTV'}
令人惊讶的是,它同样有效

也许你应该打开一个bug报告,或者询问开发者的邮件列表


如果将双引号放在替换上,语法检查器不会抱怨,而且它工作正常。我认为您应该添加它们,因为您建议的形式(没有双引号)没有文档记录,而且在未来版本的zsh中,行为可能会发生变化。

您能给我们$foo的内容吗?@diogovk当然,我添加了一个代表性的示例。在默认的
zsh
设置下,引用扩展是一个品味问题;分词和模式扩展都不适用+额外的数据点:由于
(i)
采用了一种模式,
${foo[(i)[\']]}
应该并且确实按照预期工作。谢谢,这是有意义的。我最后使用了这个:
[[$BUFFER=~”(.*)”];pat=${${match[1]}:-“”}