在bash 4中的if条件中指定变量?

在bash 4中的if条件中指定变量?,bash,variable-assignment,Bash,Variable Assignment,在bash4中,是否可以在if条件中指定变量?在下面的函数中,我想将执行cmd的输出分配给输出,并检查它是否为空字符串-都在测试条件中。函数应该输出 “返回的命令:bar” 为什么会出现上述情况? 我更喜欢使用“set-e”运行脚本,这将导致脚本在第一个非0返回/退出代码(不在if/loop条件中)时终止 考虑到这一点,想象一下cmd是一个不稳定的命令,它可能会不时以>1退出,我想一直调用它,直到它成功并获得一些输出 我不认为你能在你的条件下做到这一点 正如yi_H所指出的,if相当于 如果[

在bash4中,是否可以在if条件中指定变量?在下面的函数中,我想将执行cmd的输出分配给输出,并检查它是否为空字符串-都在测试条件中。函数应该输出

“返回的命令:bar”

为什么会出现上述情况?

我更喜欢使用“set-e”运行脚本,这将导致脚本在第一个非0返回/退出代码(不在if/loop条件中)时终止


考虑到这一点,想象一下cmd是一个不稳定的命令,它可能会不时以>1退出,我想一直调用它,直到它成功并获得一些输出

我不认为你能在你的条件下做到这一点

正如yi_H所指出的,if相当于


如果[!-z输出=bar];

这反过来基本上是


如果[!-z“输出=棒”];

所以,您要检查的是字符串“output=bar”是否为空


所以,output=bar实际上可以是!@#!@%==它仍然会做同样的事情(也就是说,表达式不会被计算)。您可能需要在子shell中分配变量,但我不确定这是否可行。

由于分配在子shell中不起作用,您需要一些解决方法


您可以临时执行一个
set+e

您可以使用这种方式

$cmd
exit_status=$?

while [[ $exit_status -gt 0 ]];
do
    #cmd is failing so far, wait and try again
    sleep 5

    $cmd
    exit_status=$?
done

编辑:这不适用于“set-e”或其他方式,不要使用“set-e”作为开头。

您可以尝试以下方法:

myfunc() {

    local cmd="echo bar"
    local output=

    while ! output=$($cmd) || [[ -z output ]];
    do
        #cmd is failing so far, wait and try again
        sleep 5
    done

    # great success
    echo "command returned: $output"
}

请注意,这是为了避免使用
set-e

如果[[!-z output=bar]],则您的代码相当于
?首先,你为什么要这样做?上面是一个简单的例子-我会澄清我只是重写了它,以明确这不是一个赋值…@yi_H抱歉,不要听你的-我确实想给输出赋值,并检查它是否是一个空字符串-内部测试条件感谢答案-对我有效。糟糕的是,“set-e”不可靠-如果使用“set-e”(见问题),IMO实现set-e背后的目标将非常有用,$cmd返回!=0时,bash将在第一次线性化之后退出,这就是为什么这个答案没有包括它的原因。”set-e'会导致混乱,并强制以不自然的方式编写脚本。在我看来,这是个麻烦,不值得。这一小段代码正是应该避免的例子。
myfunc() {

    local cmd="echo bar"
    local output=

    while ! output=$($cmd) || [[ -z output ]];
    do
        #cmd is failing so far, wait and try again
        sleep 5
    done

    # great success
    echo "command returned: $output"
}