仅当错误消息失败时才在bash中存储错误消息

仅当错误消息失败时才在bash中存储错误消息,bash,Bash,我是bash的初学者,所以如果这是一个基本问题或者有语法问题,我很抱歉,但是我在任何地方都找不到答案。我想运行一个命令,如果失败,检查错误消息是否与某个字符串匹配。以下是我所拥有的: err_msg=`./command input.txt 2>&1` if [$? -eq 1] then if [err_msg -eq "Error: timeout"] then #do something fi fi 这是正确的方法吗?如果我使用第一行定义错

我是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会是空的吗

  • 不要使用老式的反引号形式的命令替换,而是使用
    $(command)
  • 使用
    [[]]
    进行测试,而不是像以前那样使用
    []]
  • -eq
    用于整数比较。对于字符串比较,请使用
    =
    =
  • 请注意,如果退出状态other大于1,则命令可能失败,因此最好测试非零状态:
    ![[$?-eq 0]]
  • 可以使用
    $?
    测试最后一个命令的退出状态,也可以使用
    if
    直接测试:
    if命令;然后是OK;fi
  • 您可以在测试变量的退出代码时将命令的输出分配给变量
使用上述要点,您可以像这样重写代码:

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

您有一些语法错误:1。在字符
[
]
周围留一个空格:这些字符是内置的,需要在其周围留一个空格才能识别。2.不要使用
-eq
测试字符串是否相等。改用
=
。重新。您的问题:是的,
$?
将扩展到命令的返回代码。谢谢!另外,第二个if语句中的err_msg是否应该是$err_msg,因为它是一个变量?是的,当然,您要检查
err_msg
的扩展。您还需要引用此扩展:
“$err_msg”
,除非您使用更健壮的关键字
[
。这很有帮助,谢谢!您还可以使用
!err_msg=$(…)&&[$err_msg=“…”]”]
来避免嵌套的
if
语句。@chepner正是这样。不过,我发现这对初学者来说有点太混乱了。