这是我的代码摘要。我使用return_val
infunc
和之间的比较结果"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
由于要查看echo
命令的输出,因此需要将stdout输出与返回(退出)代码分开:
#!/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
的stdout输出仅按原样打印。
附录:Billy Wayne McCann的答案指出,并不需要严格使用显式return
语句来设置退出代码(但不需要使用test
[1])。
(( a > b ))
可用于通过自身的功能作为最后的语句,设置退出代码暗示:
如果没有显式return
语句,则它是函数的最后一个命令,用于设置其退出代码(类似的情况适用于没有语句的脚本exit
)。
(( ... ))
将退出代码设置为1
,如果...
计算为,则设置为0
,1
否则设置(任何非负结果)。如果表达式为true,则布尔表达式(如)将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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句