复杂的bash函数返回布尔值



我想这样做:

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命令:

  1. /bin/true总是返回0
  2. /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中,您可以简单地调用truefalse:

function one {
[[ "$1" == "hello" ]] && true || false
}
if one hello || one goodbye; then
# do stuff…
fi;

上面的一些答案几乎得到了答案。但是,您不会希望将单词"true"或"false"作为字符串回显—这与问题没有任何关系。您需要调用为此目的而创建的命令。

相关内容

  • 没有找到相关文章

最新更新