首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中检查命令是否成功` `if [ ..]`语句

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

Stack Overflow用户
提问于 2016-04-02 16:54:52
回答 2查看 10.7K关注 0票数 6

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

代码语言:javascript
复制
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   [ egrep -i -q "error|warning|fatal|missing|critical" "$File" ]
then 
  echo "testing"
fi

我期望它输出testing,因为文件存在并且egrep返回成功,但是我得到了一个错误:

代码语言:javascript
复制
-bash: [: too many arguments

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

请帮助我理解我哪里错了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-02 17:29:20

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

代码语言:javascript
复制
if command; then
    : # ... things which should happen if command's result code was 0
else
    : # ... things which should happen otherwise
fi

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

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

代码语言:javascript
复制
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   egrep -i -q "error|warning|fatal|missing|critical" "$File"
then
    echo "testing"
fi

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

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

代码语言:javascript
复制
if read thing
    case $thing in
      '' | 'quit') false;;
      *) true;;
    esac
then ...

但在实践中,您很少在if语句中看到超过一个命令(尽管这并非闻所未闻;使用||的复合语句就是一个很好的例子!)

只是为了说明这一点,

代码语言:javascript
复制
if [ egrep foo bar ]

在arguments egrep foo bar上运行[,也就是test。但是不带选项的[只接受一个参数,然后检查该参数是否是空字符串。(egrep显然不是空字符串。这里的引用是可选的,但可能会更容易理解:

代码语言:javascript
复制
if [ "egrep" ]; then
    echo "yes, 'egrep' is not equal to ''"
fi

这在孤立的情况下显然是愚蠢的,但希望能作为一个说明性的例子。)

test作为一个通用的厨房水槽的历史原因是,作者不想在if的语法中加入一部分,这是原始Bourne shell的一个不太吸引人的设计。Bash和zsh提供了不那么笨重的替代方案(就像bash中的[[双括号),当然,POSIX test比贝尔实验室的原始版本要好得多。

票数 12
EN

Stack Overflow用户

发布于 2016-04-02 17:30:57

这是可行的:将你的egrep放入"$()“中,删除-q并进行字符串比较:

代码语言:javascript
复制
if [ ! -f /opt/apps/SiteScope_backup/sitescope_configuration.zip ] ||
   [ "$(egrep -i 'error|warning|fatal|missing|critical' $File)" != "" ];
then

   echo "testing";

fi
票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36371221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档