如果在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,不时,我想继续调用它,直到它成功,我得到一些输出。
答案 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'开头。