【问题标题】:Binary operator compatibility for shellshell 的二元运算符兼容性
【发布时间】:2014-03-28 11:16:53
【问题描述】:

我不禁注意到有这么多 shell 代码使用比较运算符作为 test 命令的参数,而不是符号。

例如,使用test 测试shell 中是否没有接收到参数:

if test $# -eq 0
then
    echo "No arguments received"
fi

为什么我们不能用== 来替换-eq 更多,比如传统的、直观的、熟悉的、通用的和可读的符号?这样我们就有了以下内容:

if test $# == 0
then
    echo "No arguments received"
fi

其他比较运算符也是如此 >。

我假设这背后一定有一些技术原因(也许是兼容性问题?)偏爱-eq 格式而不是==,但我不知道它们。

【问题讨论】:

    标签: bash shell string-comparison comparison-operators


    【解决方案1】:

    首先,使用$#,而不是$@

    差异的技术原因是运算符定义了操作数的解释方式。

    对于<=>,操作数被视为字符串。这意味着 10 < 2 因为在字母表中 1-something 出现在 2-something 之前,1 != 01 因为字符串的长度不同。

    对于-eq-gt-lt,操作数被视为整数。这意味着 2 -lt 10 因为数字 2 小于数字 10,而 1 -eq 01 因为这两种写法在数字上都是等价的 1

    【讨论】:

    • 这正是我想要的!使用字符串比较运算符进行整数比较还有什么副作用?
    • 主要是这个——字母顺序与数字顺序,以及整数规范化。这在 8 月尤为重要,因为前导零表示八进制,date +%m 开始返回无效数字 08
    【解决方案2】:

    您可以在支持所有运算符的 BASH 中使用 (( and ))算术处理器),例如 ==>=<=<> 等:

    if (( $# == 0 ))
    then
        echo "No arguments received"
    fi
    

    PS:#参数由$#表示

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 2015-12-05
      • 1970-01-01
      • 2013-11-22
      • 2019-02-09
      • 2016-01-24
      • 2023-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多