如何从没有匹配项的 glob 模式中静默获取空字符串

Ame*_*ina 28 zsh wildcards

假设我有一个包含三个文件的文件夹:

foo1
foo2
bar
Run Code Online (Sandbox Code Playgroud)

1. 如果我跑

list_of_files=$(print foo*)
echo $list_of_files
Run Code Online (Sandbox Code Playgroud)

我得到: foo1 foo2

2.如果我跑

list_of_files=$(print bar*)
echo $list_of_files
Run Code Online (Sandbox Code Playgroud)

我得到: bar

3.但是,如果我跑

list_of_files=$(print other*)
echo $list_of_files
Run Code Online (Sandbox Code Playgroud)

我得到:(虽然zsh: no matches found: other*变量$list_of_files是空的)


有没有办法让 zsh 在无法匹配 glob 扩展时不抱怨?

我的目标是使用上述机制静默收集与给定 glob 模式匹配的文件列表。

Gil*_*il' 37

null_glob使用Nglob 限定符为您的模式打开选项。

list_of_files=(*(N))
Run Code Online (Sandbox Code Playgroud)

如果您对脚本或函数中的所有模式执行此操作,请打开该null_glob选项:

setopt null_glob
Run Code Online (Sandbox Code Playgroud)

这个答案有 bash 和 ksh 等价物。

不要使用print或命令替换!这会生成一个由文件名组成的字符串,它们之间有空格,而不是字符串列表。(参见什么是分词?为什么它在 shell 编程中很重要?


arn*_*rnt 17

更好的方法:for a in *(.N); do ... ; done。N 选项使 zsh 向 for 传递一个空列表,并且 for 将迭代零次。

当心ls *.foo(.N); 当 ls 收到一个空参数列表时,它会列出所有文件而不是一个文件。这就是为什么我不喜欢 NULL_GLOB(或它的 bash 等价物):它改变了所有的 globs 并且很容易中断对例如 ls 的调用。