while循环命令和stdout处理

时间:2017-03-24 20:55:48

标签: bash shell scripting

我有一个Bash函数foo(),它将始终返回0或1。当它返回0时,它会产生一些标准输出:

foo() {
    if ...
      echo "aaa\nbbb"
      return 0
    else
      return 1
    fi
}

我想重复调用这个foo函数,处理它的标准输出,直到它返回非零值:

while foo; do
  # process foo's stdout that that one execution
done

但我不知道如何干净地存储foo的标准输出并同时在while表达式中使用它。

在红宝石中我可能做过类似的事情:

while text = self.foo do
  ...
end

有什么建议吗? TIA

5 个答案:

答案 0 :(得分:1)

我会改变一点joi.d.ts out of date, missing types,如:

while
它的打印方式如下:

foo() {
    if (( $RANDOM % 5 ))
    then
        seq $(( $RANDOM % 10 ))
        return 0
    else
        return 1
    fi
}

while :
do
    #store the output to variable and check the return value
    var="$(foo)" || { echo no more input; exit 1; }
    echo got $(grep -c . <<<"$var") lines
done

答案 1 :(得分:1)

最明显的是将其保存到文件中:

foo() {
    if ...
      echo "aaa\nbbb"
      return 0
    else
      return 1
    fi
}

while foo > tmpfile; do
  # process tmpfile
done
rm tmpfile

答案 2 :(得分:0)

foo()返回1时,您可以使用无限循环中断:

while : ; do
    out=$(func)
    [[ $? -eq 1 ]] && break
    # process the stdout of foo() here - which is stored in variable 'out'
    echo $out
done

答案 3 :(得分:0)

要将输出存储在 $ x 中,请执行:

x=`while foo; do <whatever> ; done`

类似的例子,(使用一个相当不必要的while循环),显示了这些代码的行为:

x=`seq 96 98 | while read x ; do echo $x | rev ; done` ; echo $x

输出:

69 79 89

要将这三个数字分配到bash数组,请用括号括住``

x=(`seq 96 98 | while read x ; do echo $x | rev ; done`) ; echo ${x[2]}

输出:

89

答案 4 :(得分:0)

没有人解释为什么你的代码不起作用。

  1. 不要混用echoreturn,而是将print(f)return结合使用。这将从函数信号中分离出函数-stdout。

  2. 我不建议使用函数来启动循环,因为这样函数和循环只会被调用一次。你可以运行一个无限循环,并在满足验证时将其分解。

  3. 代码看起来像这样......

    #!/bin/bash
    
    function foo() {
        if [ true = true ]; then    # some simple test
            printf "aaa\nbbb"   # stdout
            return 0    # singal (function status)
        else
            return 1
        fi
    }
    
    while true  # infinity loop
    do
        STDOUT=$(foo)   
        ERRNO="$?"  # error number / return value / signal
        if [ "$ERRNO" -ne 0 ] ; then # -ne means Not Equal
            break   # end loop
        fi
        echo "$STDOUT"
    done
    
    exit "$ERRNO"   # exit with return value of foo
    

    输出看起来像这样......

    aaa
    bbb
    aaa
    bbb
    

    直到你点击ctrl-c或函数返回为1