我以为这很简单-但事实证明它比我预期的要复杂。
我想遍历目录中特定类型的所有文件,所以我这样写:
#!/bin/bash
for fname in *.zip ; do
echo current file is ${fname}
done
只要目录中至少有一个匹配文件,此方法就起作用。但是,如果没有匹配的文件,我会得到:
current file is *.zip
然后,我尝试:
#!/bin/bash
FILES=`ls *.zip`
for fname in "${FILES}" ; do
echo current file is ${fname}
done
虽然没有文件时循环主体不执行,但是我从ls收到错误:
ls: *.zip: No such file or directory
如何编写一个干净地处理没有匹配文件的循环?
@cuolnglm:怪异的是,如果我执行
—
symcbean 2015年
FILES=
ls * .zip ; for fname in "${FILES}"...
,这会导致ls返回执行脚本的名称,而不是此RHEL5框上的空列表(bash 3.2.25),但它确实可以正常工作for fname in *.zip ; do....
使用
—
斯特凡Chazelas
for file in *.zip
,而不是`ls ...`
。@cuonglm的建议是,*.zip
当模式与任何文件都不匹配时,它扩展为空。ls
不带参数列出当前目录。
—
mgutt
shopt -s nullglob
在运行for循环之前添加。