假设我有一个包含三个文件的文件夹:
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
使用N
glob 限定符为您的模式打开选项。
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 的调用。
归档时间: |
|
查看次数: |
9193 次 |
最近记录: |