测试表达式中的参数扩展是否可能?

von*_*otz 0 bash arithmetic command-substitution test

当我在中尝试以下表达式时,bash收到一条奇怪的错误消息:

[: -lt: unary operator expected
Run Code Online (Sandbox Code Playgroud)

首先是函数定义

some_func () {
  (( 3 + 5 ))
}
Run Code Online (Sandbox Code Playgroud)

还有表情

[ $(some_func) -lt 10 ] && true
Run Code Online (Sandbox Code Playgroud)

我想问题是将运算符-lt与命令替换和/或算术扩展混合在一起?

退出代码$?为 2,消息为an unary op was expected

Qua*_*odo 6

它应该是

some_func() {
  echo "$(( 3 + 5 ))"
}
[ "$(some_func)" -lt 10 ]
Run Code Online (Sandbox Code Playgroud)

为什么失败

$(some_func)扩展到函数 *的输出(减去其尾随换行符),但它什么都不输出。因此,测试变为

[ -lt 10 ]
Run Code Online (Sandbox Code Playgroud)

在其最基本的形式中,所述[测试接受1个至3个参数。由于上面有 2 个参数,Bash 期望第一个是一元运算符。-lt是二进制的,因此是错误消息。

假如你引述的扩展酌情使用

[ "$(some_func)" -lt 10 ]
Run Code Online (Sandbox Code Playgroud)

错误将是“预期的整数表达式”,因为测试将具有空字符串:

[ "" -lt 10 ]
Run Code Online (Sandbox Code Playgroud)

而且,除非在不平凡的情况下&& true是多余的。

*由于扩展没有加引号,输出也经过分文件名扩展。这些不应该在本示例中发挥作用,但只要$IFS未更改其默认值即可。