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