我有一个脚本必须处理目录中的一些文件(名称以AB开头)。 代码是:
for file in AB*
do
cp ...
...
done
当文件夹中没有* .txt文件时,代码执行一次。 但后来有错误,因为我试图复制一个不存在的文件。 当ls-command的结果为空时,如何使do-command不执行?
我已经尝试过使用ls,引用组合>什么都没有给出我想要的结果。
答案 0 :(得分:3)
也许您可以在之前添加条件:
if [ $(ls AB* 2>/dev/null) ]; then
for ...
fi
使用2>/dev/null
可以捕获不打印的错误。
答案 1 :(得分:1)
Bash中的其他答案只是完全错误。不要使用它们! 请始终遵守此规则:
每次在Bash中使用globs时,请将其与
shopt -s nullglob
或shopt -s failglob
一起使用。
如果你遵守这条规则,你将永远安全。事实上,每当你不遵守这条规则时,上帝杀了一只小猫。
shopt -s nullglob
:在这种情况下,不匹配的glob扩展为空。看:
$ mkdir Test; cd Test
$ shopt -u nullglob # I'm explicitly unsetting nullglob
$ echo *
*
$ for i in *; do echo "$i"; done
*
$ # Dear, God has killed a kitten :(
$ # but it was only for demonstration purposes, I swear!
$ shopt -s nullglob # Now we're going to save lots of kittens
$ echo *
$ for i in *; do echo "$i"; done
$ # Wow! :)
shopt -s failglob
:在这种情况下,当glob没有扩展时,Bash会引发一个显式错误。看:
$ mkdir Test; cd Test
$ shopt -u nullglob # Unsetting nullglob
$ shopt -s failglob # Setting failglob for the love of kittens
$ echo *
bash: no match: *
$ # cool :) what's the return code of this?
$ echo $?
1
$ # who cares, anyway? and a for loop?
$ for i in *; do echo "$i"; done
bash: no match: *
$ # cool :)
使用nullglob
或failglob
,您肯定不会使用不受控制的参数启动随机命令!
干杯!
答案 2 :(得分:0)