如果在bash 4中有条件,则在里面赋值变量?

时间:2012-02-03 21:15:14

标签: bash variable-assignment

如果在bash 4中有条件的话可以在内部分配变量吗?即。在下面的函数中,我想将执行cmd的输出分配给输出并检查它是否为空字符串 - 两者都在测试条件内。该函数应输出

  

“命令返回:bar”

myfunc() {

local cmd="echo bar"
local output=

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

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

为什么以上?

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

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

4 个答案:

答案 0 :(得分:0)

我认为您无法在条件

中执行此操作

正如yi_H所指出的那样,if等同于

if [[ ! -z output=bar ]];

反过来基本上是

if [[ ! -z "output=bar" ]];

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

所以,output = bar实际上可能就像!@#!@%===并且它仍然会做同样的事情(也就是说,表达式没有被评估)。你可能不得不以某种方式在子shell中分配变量,但我不确定它是否会起作用。

答案 1 :(得分:0)

由于分配在那里不起作用,你需要一些workaroudn。

您可以临时执行set +e ...

答案 2 :(得分:0)

您可以尝试这样的事情:

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"
}

请注意,strongly recommended是{{3}},以避免使用set -e

答案 3 :(得分:-1)

你可以用这种方式......

$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'开头。