我有一个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
答案 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)
没有人解释为什么你的代码不起作用。
不要混用echo
和return
,而是将print(f)
与return
结合使用。这将从函数信号中分离出函数-stdout。
我不建议使用函数来启动循环,因为这样函数和循环只会被调用一次。你可以运行一个无限循环,并在满足验证时将其分解。
代码看起来像这样......
#!/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
。