使用 zsh 检查数字是否在范围内

使用 zsh 检查数字是否在范围内

为什么传递 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返回10,具体取决于关系是否为真。

因此,如果k0,则((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.

相关内容