我正在执行一些从控制台生成字符串的操作,例如我正在执行以下操作:
./eqagent add-target target-type=kafka events-servers=localhost:9999
并收到此消息:
Equalum agent已返回以下错误:代理程序目标 已存在
我想抓住它并将其存储到变量中,然后使用if语句将其用作条件。
答案 0 :(得分:1)
您的问题在我看来就像一个典型的X-Y problem:您的问题是您希望在命令失败时采取行动,当发生这种情况时,它会将返回值设置为非零值。所以你真正想要的是使用$?
变量。以下是您的用例的一般示例:
$ ./command
Argh... Failure!
$ echo $?
1
所以你可以这样做:
if [ $? -eq 1 ]; then
echo "It failed :("
fi
您可能有几个返回值来判断错误,因此您可以检查等于2
,3
或255
的值。
但是你的shell允许你以更简洁的方式做到这一点:
# prints 'it failed :(' only when command's result ($?) is non-null
./command || echo "it failed :("
因此,对于您的示例,您应该能够使用以下方法完成它:
./eqagent add-target target-type=kafka events-servers=localhost:9999 || echo "it failed :("
如果你的命令真的只使用字符串返回错误状态(不好),你可以使用以下命令检查 exact 字符串:
output=$(./eqagent add-target target-type=kafka events-servers=localhost:9999)
if [ "$output" == "Equalum agent has returned the following error: The agent target already exists" ]; then
echo "it failed :("
fi
最后你可以检查子字符串包含(如果这是不是你程序的唯一输出):
error_msg="The agent target already exists"
if [ -z "${output##*$error_msg*}" ] ;then
echo "it failed :("
fi
上述语法适用于大多数shell(bash,ksh,dash ...)。
如果你没有得到$output
变量所期望的输出,这可能是程序在stderr而不是stdout上输出错误,你可以使用以下技巧加入两个输出:< / p>
output=$(./eqagent add-target target-type=kafka events-servers=localhost:9999 2>&1)
最后在实际使用案例中,您可能想要两者兼而有之:
error_msg="The agent target already exists"
output=$(./eqagent add-target target-type=kafka events-servers=localhost:9999)
if [ $? -ne 0 ]; then
echo -n "it failed "
if [ -z "${output##*$error_msg*}" ] ;then
echo "; because target already exists. :-s"
else
echo ":-("
fi
fi
答案 1 :(得分:0)
试试这个:
message=$(./eqagent add-target target-type=kafka events-servers=localhost:9999 2>&1)
varname=$(some command)
语法称为命令替换,并扩展为括号内包含的命令生成的字符串。
2>&1
部分是一个重定向,它接受文件描述符2的输出(通常称为“标准错误”)并使其转到与文件描述符1相同的输出(通常称为“标准”出“)。这可以确保您的进程替换将收集两者的输出,因为命令替换仅捕获标准输出,而不是标准错误。
如果您只想测试失败是否成功,可以使用命令的返回码,如下所示:
if
./eqagent add-target target-type=kafka events-servers=localhost:9999 2>&1
then
# Success!
else
# Failure...
fi
如果在命令执行后立即调用,返回代码也可以在特殊的shell变量$?
中使用,并且vy约定成功为零,失败时为非零值。
答案 2 :(得分:0)
variable=`your-command`
然后使用$ variable
做任何你想做的事答案 3 :(得分:0)
var="$((./eqagent add-target target-type=kafka events-servers=localhost:9999)2>&1)" # We must also make sure that stderr goes into stdin so we can capture the error message. That is what 2>&1 does
if [ $? -ne 0 ];then # Eg, it failed
echo "the output is stored in '$var'."
echo "$var" > error_log.txt
fi
应该做的伎俩
编辑:忘记添加stderr重定向...