这是我的代码摘要。我使用return_val
和func
中的"true"
之间的比较结果来确定while终止条件。但回声根本不起作用。
#!/bin/bash
func(){
a=$1
b=$2
echo $a
echo $b
if ((a > b))
then
return_val="true"
else
return_val="false"
fi
}
c=1
d=4
while [[ $(func $c $d) && ("$return_val"!="true") ]]
do
((c++))
done
答案 0 :(得分:1)
我宁愿让函数返回一个值。
#!/bin/bash
func(){
a=$1
b=$2
echo $a
echo $b
if ((a > b))
then
return 0 # 0 means success
else
return 1 # non-zer0 means failure
fi
}
c=1
d=4
until (func $c $d) #While ! success, do something..
do
((c++))
done
注意:func $c $d
周围的括号仅用于提高可读性。真的不需要。
答案 1 :(得分:1)
由于您希望查看echo
命令的输出,您需要将 stdout输出与 return(退出)代码分开:
#!/bin/bash
func(){
local a=$1 b=$2
echo "$a" # stdout output
echo "$b"
if (( a > b )) # see below for how this could be simplified.
then
return 0 # set exit code
else
return 1
fi
}
c=1 d=4
while ! func $c $d
do
((c++))
done
这样,您可以直接使用函数(前缀为!
来取消测试的结果),而无需替换命令,并让其返回(退出)代码驱动while
循环条件的结果(退出代码0
表示成功,任何其他意味着失败)。
仅使用! func $c $d
作为条件,func
的标准输出就会按原样打印。
附录:Billy Wayne McCann's answer指出,没有严格要求使用显式return
语句设置退出代码(但是没有#n}需要使用test
[1] )。
(( a > b ))
可以单独使用 作为函数中的最后一个语句,隐式设置退出代码 :
如果没有明确的return
语句,则它是一个函数的 last 命令,用于设置其退出代码(这同样适用于脚本没有exit
声明。)
(( ... ))
将退出代码设置为1
,如果...
评估为0
,则设置1
(任何非负结果)。如果表达式为真,则a > b
等布尔表达式会生成1
,否则会生成0
。因此,(( a > b ))
本身隐含地执行上述if
语句显式:
func(){
local a=$1 b=$2
echo "$a" # stdout output
echo "$b"
(( a > b )) # exit code implicitly set to 0, if test *succeeds*, 1 otherwise
}
[1]使用test
或[ ... ]
是符合POSIX标准的评估条件的方法。除非您的代码必须符合POSIX标准,否则Bash的[[ ... ]]
和(( ... ))
(对于算术布尔测试)是更好的选择 - 请参阅https://stackoverflow.com/a/29320710/45375 < / SUP>
答案 2 :(得分:1)
强制返回0或1并不是正确的方法。您希望返回测试的真实退出状态,而不是强制返回状态。实际上不需要if ... then
块。
功能会自动返回退出状态。该函数的退出状态是最终语句的状态。因此,可以将test
作为func
中的最终陈述。
#!/usr/bin/env bash
func(){
local a=$1
local b=$2
test $a -lt $b #use exit status directly
}
c=1
d=4
while func $c $d #while c is less than d
do
((c++))
done