不要在ls中执行文件

时间:2013-08-09 08:44:08

标签: linux bash for-loop

我有一个脚本必须处理目录中的一些文件(名称以AB开头)。 代码是:

for file in AB*
do
  cp ...
  ...
done

当文件夹中没有* .txt文件时,代码执行一次。 但后来有错误,因为我试图复制一个不存在的文件。 当ls-command的结果为空时,如何使do-command不执行?

我已经尝试过使用ls,引用组合>什么都没有给出我想要的结果。

3 个答案:

答案 0 :(得分:3)

也许您可以在之前添加条件:

if [ $(ls AB* 2>/dev/null) ]; then
     for ...

fi

使用2>/dev/null可以捕获不打印的错误。

答案 1 :(得分:1)

Bash中的其他答案只是完全错误。不要使用它们! 请始终遵守此规则:

  

每次在Bash中使用globs时,请将其与shopt -s nullglobshopt -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 :)
    

使用nullglobfailglob,您肯定不会使用不受控制的参数启动随机命令!

干杯!

答案 2 :(得分:0)

你可能需要bash test builtin,通常缩写为[,有点像

if [ -f output.txt ] ; then

注意:空格在上面很重要。