为了这个问题,假设 glob/a/b/c/*
不产生匹配项。
这意味着以下测试应该失败(换句话说,它应该产生一个非零$?
):
[[ -n /a/b/c/*(#qN) ]]
如果我直接在 (zsh) 命令行上运行测试,实际上就是这种情况。但是,如果我在脚本中粘贴完全相同的测试,它会成功,这不是预期的行为。
如果我使用标志运行相同的脚本-x
,则生成的跟踪将测试显示为
[[ -n '/a/b/c/*(#qN)' ]]
我不明白为什么单引号出现在 test 的参数周围;在脚本的源代码中根本没有引号。
如果 zsh 自动插入这些单引号,这就解释了为什么文本会成功。
问题:
- 为什么此表达式的命令行版本和脚本版本之间存在差异?
- 我需要做什么才能使测试(正确)在脚本中失败?
从
CONDITIONAL EXPRESSIONS
zsh手册的部分:换句话说,在您的脚本中,如果
extendedglob
未设置该选项,则将/a/b/c/*(#qN)
其视为文字字符串。检查 glob 是否与任何文件匹配的更好的习惯用法(IMO)是:
那不需要
extendedglob
和那个特殊情况[[ -n ...(#qN) ]]
。Y1
并且由于在第一场比赛中停止,效率也更高。它通过将全局扩展传递给一个匿名函数来工作,该函数的主体是
(($#))
算术表达式,如果该匿名函数的参数数量非零,则返回 true。您可以将其扩展到以下内容: