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。
它应该是
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未更改其默认值即可。