仅当错误消息失败时才在bash中存储错误消息
我是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 这是正确的方法吗?如果我使用第一行定义错
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正是这样。不过,我发现这对初学者来说有点太混乱了。