Bash $(false)作为函数参数为true

时间:2018-04-25 06:22:50

标签: bash

我创建了一个回显T或F的函数。

tf() {
$1 && echo "T" || echo "F"
}

似乎有效......

tf true  # T
tf false # F

但是我想在使用'test'命令时将它用于反馈。我通过了一个测试,该测试应该导致F为false:

tf $(test 4 -eq 3)  # T ?

但它真的回来了! 这是什么?我以为$()会将结果(false)替换为它的位置!

所以我检查看看没有这个功能会发生什么;其他一切都是平等的:

$(test 4 -eq 3) && echo "T" || echo "F"  # F

......这是正确的答案; F表示错误。 4不等于3。

那么:为什么在将函数作为参数传递给函数时,false的命令替换会变为真?

我也看到普通的$(false)在作为函数参数传递时变为true。但是在函数之外,$(false)是正确的错误:

tf $(false)  # T ?
$(false) && echo "T" || echo "F"  # F

如何安全地将真或假评估命令传递给函数,并确保它们的真或假结果将在函数体内正确处理?是否有其他格式包装它?

1 个答案:

答案 0 :(得分:3)

看起来你在这里混合了什么。

test仅返回退出代码0 (TRUE)1 (FALSE)

您可以通过运行来轻松检查:

$(test 4 -eq 3) echo $?

您正尝试将此值提供给函数 tf $(test 4 -eq 3)不起作用,因为$(test 4 -eq 3)不返回值,只返回退出代码。

当您手动尝试时,它会起作用,因为&&|| operators依赖于上一个命令的退出代码。

要使其正常工作,您需要更改为函数提供参数的方式。例如像这样(可能你想将它拆分为变量以使其可读):

tf $(test 4 -eq 3 && echo true || echo false)

与下面提到的'plain'$(false)相同。执行true或false时,您将获得01的退出代码。它们无法实现此功能,但与&&||运算符配合良好: $(false) && echo "T" || echo "F"