2017-12-02 124 views
1

我是bash的初学者,所以如果这是一个基本问题或有语法问题,但我无法在任何地方找到答案,我表示歉意。我想运行一个命令,如果失败,请检查错误消息是否与某个字符串匹配。这是我有:仅在bash中存储错误消息

err_msg=`./command input.txt 2>&1` 
if [$? -eq 1] 
then 
    if [err_msg -eq "Error: timeout"] 
    then 
     #do something 
    fi 
fi 

这是正确的方法来做到这一点?如果我使用第一行来定义错误消息err_msg,那么$?仍然存储命令的通过/失败状态?另外,如果命令通过会发生什么? err_msg会是空白吗?

+0

你有一些语法错误:1,留出空间周围的字符'['和']':这些都是内建的,需要有一个空间周围的空间被认可。 2.不要使用-eq来测试字符串是否相等。改用'='。回覆。你的问题:是的,'$?'将扩展到命令的返回码。 –

+0

谢谢!另外,如果err_msg是第二个if语句中的$ err_msg,因为它是一个变量? –

+0

是的,当然,你想检查'err_msg'的扩展。您还需要_quote_这个扩展:''$ err_msg“',除非您使用更强大的关键字'[[''。 –

回答

0
  • 不要使用命令替换的旧式反引号形式,使用$(command)代替
  • 使用[[ ]]进行测试,而不是[ ]因为它有more features and fewer surprises
  • -eq用于整数比较。对于字符串比较,使用===
  • 注意命令可能失败,退出状态等比1,因此是更好的测试非零状态:! [[ $? -eq 0 ]]
  • 可以使用$?测试退出最后一个命令的状态,或者你可以直接if测试:if command; then echo CMD OK; fi
  • 您可以将命令的输出到一个变量,而测试它的退出代码

使用上述几点,你可以重写你的代码是这样的:

if ! err_msg=$(./command input.txt 2>&1) 
then 
    if [[ $err_msg = "Error: timeout" ]]; then 
     echo "Doing something.." 
    fi 
fi 
+0

你也可以用'! err_msg = $(...)&& [[$ err_msg =“...”]]'以避免嵌套的if语句。 – chepner

+0

@chepner正是。但是,我发现对于初学者来说有点太混乱了。 – PesaThe