9

考虑这个简单的循环:

for f in *.{text,txt}; do echo $f; done

我只想回显有效的文件名。在脚本中使用 $f 变量一切正常,除非没有该扩展名的任何文件。在空集的情况下, $f 设置为 *.text 并且上面的行回显:

*.text
*.txt

而不是什么都不回应。如果您尝试将 $f 用于任何需要实际真实文件名的东西,而不是得到 *.

如果有任何文件与通配符匹配,因此它不是一个空集,一切都会按我的意愿工作。例如

123.text
456.txt
789.txt

我怎样才能做到这一点而不会出现错误,并且第一个字符串与 $f 匹配星号的看似过于复杂?

4

3 回答 3

15

设置nullglob选项。

$ for f in *.foo ; do echo "$f" ; done
*.foo
$ shopt -s nullglob
$ for f in *.foo ; do echo "$f" ; done
$ 
于 2012-09-07T14:59:47.797 回答
4

您可以测试该文件是否确实存在:

for f in *.{text,txt}; do if [ -f $f ]; then echo $f; fi; done

或者您可以使用以下find命令:

for f in $(find -name '*.text' -o -name '*.txt'); do
  echo $f
done
于 2012-09-07T14:56:42.840 回答
0

此外,如果您负担得起 的外部使用ls,您可以通过使用来逃避其结果

for f in `ls *.txt *.text`;
于 2012-09-07T14:58:09.607 回答