如何在bash测试中使用参数函数[

时间:2014-10-07 14:14:19

标签: bash shell if-statement sh

假设我有一个函数foo,它接受两个参数并返回true或false,我想在测试中使用它[bash中的命令,有些像这样

param1=one
param2=two
if [ foo $param1 $param2 ]; then
    do something
fi

我知道这样可以使用像这样的[]

if foo $param1 $param2; then .....

但我希望在[]中使用它。

2 个答案:

答案 0 :(得分:3)

如果要测试命令的退出状态是否表示成功或失败,请完全取消括号;在该用例中使用test命令是错误的,完全停止。

在这种情况下,

if foo "$param1" "$param2"; then ...; fi

是唯一正确的语法,它不是非常低效的。


肯定可能在您的子流程中发出$?,并使用test检查输出,如下所示:

if [ "$(foo "$param1" "$param2" >&2; echo "$?")" -eq 2 ]; then ...; fi

......但再次看到:“不必要的低效率”;这样写得更好:

foo "$param1" "$param2"; retval=$?
if [ $retval -eq 2 ]; then ...; fi

...避免不必要的子shell的所有开销。


如果要测试命令的输出是否为非空(通常是不合需要/不必要的操作,因为大多数标准UNIX命令可以指示它们是否正确运行,是否发现了它们是什么正在通过退出状态搜索等等:

if [ -n "$(foo "$param1" "$param2")" ]; then ...; fi

是对的。


要记住一件重要的事情 - 任何使用$()都会使您的函数从父shell内部运行(从而能够更新或修改该shell的状态)到子shell中。所以 - 如果您的函数应该在shell中更改变量或状态,则使用$()将修改其行为。

答案 1 :(得分:2)

test[ ]评估表达式,而不是函数的退出状态

要评估功能 / 命令的退出状态,请按照您使用它的方式使用if

if foo "$param1" "$param2"; then .....