我想这样做:
function one {
if [ "$1" == "hello" ]; then
return true
fi
return false
}
if [ one hello -o one goodbye ]; then
echo "Well, that's weird."
fi
如前所述,我知道这不起作用。Bash不允许返回布尔值。你可以返回0或1。但是bash似乎不喜欢使用0或1作为布尔表达式。所以我必须返回0而不是true,返回1表示false。我可以接受。然后if变成:
if [ one hello -eq 0 -o one goodbye -eq 0 ] ...
我可以这么做,但是很尴尬。但这并不工作,因为测试不想叫我函数与一个论点。
if [ `one hello` -eq 0 -o `one goodbye` -eq 0 ] ...
最后,我认为这个版本有效。但它很丑。
是否有一种优雅的方式:
- 有一个bash函数返回true/false
- 它接受参数
- 然后在复杂的if语句中使用([]之间有-o/-a的组合)
我真的很想写:
if [ myfunc1 $somearg -a $myfunc2 $someotherarg ]; then ...
现在,我正在用丑陋的方式来做。
不需要这样写谓词。相反,如果函数成功,则将退出状态设置为0,如果函数失败,则设置为非零值。然后if
语句直接检查退出状态。
one () {
if [ "$1" = "hello" ]; then
return 0
fi
return 1
}
if one hello || one goodbye; then
echo "Well, that's weird."
fi
由于[
本身是一个命令,当测试为真时具有0退出状态,如果为假则为1,因此您可以简单地定义one
为
one () {
[ "$1" = "hello" ]
}
如果没有return
语句,则函数的退出状态为最后执行的命令的退出状态。
函数不返回true或false。相反,他们成功或失败。if
检查命令是否成功。[
是shell脚本中使用的一个非常常见的命令,但是它误导了许多人,使他们认为它是语法的一部分。事实并非如此。你可以简单地写:
if one hello || one goodbye; then
echo "Well, that's weird."
fi
您不希望使用-a
或-o
。(那些通常作为参数传递给[
,但实际上是不赞成使用。)请使用shell操作符&&
和||
。
关于字符串"true"one_answers";false"它们也是shell内置命令,具有预期的退出状态:
function one {
[[ "$1" == "hello" ]] && echo true || echo false
}
a=$(one hello)
b=$(one goodbye)
if $a || $b; then ...
但是,不要这样做。请像其他回答建议一样简单。
像这样?
one () {
if [ "$1" = "hello" ]; then
echo true; return 0
fi
echo false; return 1
}
$ one hello && one bye || one hello
true
false
true
使用builtin
、/bin/true
和/bin/false
命令:
/bin/true
总是返回0
。/bin/false
总是返回1
。
function one {
[[ "$1" == "hello" ]] && /bin/true || /bin/false
}
if one hello || one goodbye; then
# do stuff…
fi;
因为它们是/bin
(/usr/bin
)目录下的builtins
,它可能在$PATH
中,您可以简单地调用true
或false
:
function one {
[[ "$1" == "hello" ]] && true || false
}
if one hello || one goodbye; then
# do stuff…
fi;
上面的一些答案几乎得到了答案。但是,您不会希望将单词"true"或"false"作为字符串回显—这与问题没有任何关系。您需要调用为此目的而创建的命令。