bash shell脚本 - 从控制台获取字符串并将其存储到变量中

时间:2017-04-25 10:46:16

标签: bash shell scripting

我正在执行一些从控制台生成字符串的操作,例如我正在执行以下操作:

./eqagent add-target target-type=kafka events-servers=localhost:9999

并收到此消息:

  

Equalum agent已返回以下错误:代理程序目标   已存在

我想抓住它并将其存储到变量中,然后使用if语句将其用作条件。

4 个答案:

答案 0 :(得分:1)

您的问题在我看来就像一个典型的X-Y problem:您的问题是您希望在命令失败时采取行动,当发生这种情况时,它会将返回值设置为非零值。所以你真正想要的是使用$?变量。以下是您的用例的一般示例:

$ ./command
Argh... Failure!
$ echo $?
1

所以你可以这样做:

if [ $? -eq 1 ]; then
    echo "It failed :("
fi

您可能有几个返回值来判断错误,因此您可以检查等于23255的值。

但是你的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重定向...