我有一个脚本必须处理目录中的一些文件(名称以 AB 开头)。代码是:
for file in AB*
do
cp ...
...
done
当文件夹中没有 *.txt 文件时,代码仍会执行 1 次。但是随后出现错误,因为我尝试复制一个不存在的文件。当 ls-command 的结果为空时,如何使 do-command 不执行?
我已经尝试过使用 ls,引用一个组合 > 没有给出我想要的结果。
也许您可以在之前添加一个条件:
if [ $(ls AB* 2>/dev/null) ]; then
for ...
fi
与2>/dev/null
您一起捕获不被打印的错误。
其他答案在 Bash中完全是错误的。不要使用它们!请始终遵守以下规则:
每次在 Bash 中使用 glob 时,将它们与
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
or failglob
,您肯定不会启动带有不受控制的参数的随机命令!
干杯!