2

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

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

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

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

4

3 回答 3

3

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

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

fi

2>/dev/null您一起捕获不被打印的错误。

于 2013-08-09T08:48:32.380 回答
1

其他答案在 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 :)
    

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

干杯!

于 2013-11-02T21:52:24.263 回答
0

您可能需要test 内置bash ,通常缩写为[,类似于

if [ -f output.txt ] ; then

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

于 2013-08-09T08:48:25.093 回答