在bash`if [..]`语句中检查命令是否成功

时间:2016-04-02 08:54:52

标签: bash

我正在尝试自动化我们的应用程序备份。部分过程是在egrep语句中检查if的退出状态:

if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   [ egrep -i -q "error|warning|fatal|missing|critical" "$File" ]
then 
  echo "testing"
fi

我希望它输出testing,因为该文件存在且egrep返回成功,但我收到了错误:

-bash: [: too many arguments

我尝试了各种语法 - 附加括号,引号等,但错误仍然存​​在。

请帮助我理解我出错的地方。

2 个答案:

答案 0 :(得分:7)

您犯了一个常见错误,即假设[if语句语法的一部分。它不是; if的语法只是

if command; then
    ... things which should happen if command's result code was 0
else
    ... things which should happen otherwise
fi

我们使用的常见command之一是[,它是命令test的别名。这是一个比较字符串,数字和文件的简单命令。它接受一个相当狭窄的参数组合,如果你没有传递预期的参数,往往会产生令人困惑和误导性的错误消息。 (或者更确切地说,一旦你习惯了它,错误信息就足够了,但如果不使用它们很容易被误解。)

在这里,您要检查命令egrep的结果:

if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   egrep -i -q "error|warning|fatal|missing|critical" "$File"
then
    echo "testing"
fi

在一般情况下,command可以是管道或命令列表;然后,最终命令的退出代码是if将检查的状态,类似于脚本中的最后一个命令如何决定脚本的退出状态。

这些复合命令可以任意复杂,如

if read thing
    case $thing in
      '' | 'quit') false;;
      *) true;;
    esac
then ...

但实际上,你很少在if语句中看到多个命令(尽管它并非闻所未闻;你的||复合语句就是一个很好的例子!)

test作为一般厨房的历史原因,作者不想参与if的语法,这是原始Bourne shell的一个不太吸引人的设计。 Bash和zsh提供了不那么笨重的替代方案(比如bash中的[[双括号),当然,POSIX test比Bell的原始创作更加温和。实验室。

答案 1 :(得分:-4)

这样做:将你的egrep放入“$()”,删除-q并进行字符串比较:

if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   [ "$(egrep -i 'error|warning|fatal|missing|critical' $File)" != "" ];
then

   echo "testing";

fi