为什么传递 0 作为参数会导致误报(打印“True”)?
#!/bin/zsh
k="$1"
if ((0 < k < 1))
then
echo "True"
fi
注意该脚本名为stitch_applier.sh
终端
% ./stitch_applier.sh 0
True
这是在 Linux 系统上运行的。
答案1
shell 的算术不支持这样的链式比较。相反,第一个a < b
返回1
或0
,具体取决于关系是否为真。
因此,如果k
是0
,则((0 < k < 1))
是,与左关联的情况((0 < 0 < 1))
相同。(( (0 < 0) < 1))
零不小于零,0 < 0
假也是如此,因此在算术上下文中,0
。然后我们就得到了0 < 1
,这是真的,然后就可以了。
如果你想测试是否k
在一个范围内,你需要这样做((0 < k && k < 1))
。
请注意,例如 Bash 和许多其他 shell 只处理整数算术,并且不存在严格介于 0 和 1 之间的整数,因此在这些 shell 中,测试总是会失败。不过,Ksh 和 Zsh 可以处理浮点数。
运营商就是这样在C语言中工作,以及所有的POSIX,重击和兹什请参阅算术运算符的 C 定义。 (POSIX 只定义$(( ))
,而不定义(( ))
,但 Bash 和 Zsh 在两者中对算术的处理方式相同。否则会令人困惑。)
一些较新的语言的工作方式有所不同。 Python 是出了名的友好, 支持链式比较, 和锈和C++至少已经讨论过添加类似的支持。就像 C++ 文档注释一样,无论如何,没有人会a < b < c
故意使用 C 意义上的注释。 ((a < b) != (c < d)
不过,类似的东西可能有用途。它检查其中一个关系是否正确。)Perl 和 GNU awk 似乎给出了1 < 2 < 3
.