假设我有一个函数foo,它接受两个参数并返回true或false,我想在测试中使用它[bash中的命令,有些像这样
param1=one
param2=two
if [ foo $param1 $param2 ]; then
do something
fi
我知道这样可以使用像这样的[]
,
if foo $param1 $param2; then .....
但我希望在[]
中使用它。
答案 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)