我一直在试图从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 :(得分: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的未来版本中行为可能会改变。