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

时间:2014-09-11 03:22:35

标签: zsh

我一直在试图从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'"

1 个答案:

答案 0 :(得分:2)

由chepner指出编辑:

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

首先,̶这是如何我想你应该做的取代是这样的:̶

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

N̶o̶w̶,̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶ 我不认为这是通过设计完成的,但语法检查器并没有将引用作为单个字符进行解释 替代,但作为要完成的报价。

很奇怪,当您添加额外的}'时,解析器会正确解释您的替换。

虽然它实际上忽略了它。你可以尝试:

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

令人惊讶的是它也有效。

也许您应该打开错误报告,或询问开发人员邮件列表。

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