我创建了一个回显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
如何安全地将真或假评估命令传递给函数,并确保它们的真或假结果将在函数体内正确处理?是否有其他格式包装它?
答案 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时,您将获得0
或1
的退出代码。它们无法实现此功能,但与&&
和||
运算符配合良好:
$(false) && echo "T" || echo "F"