代码之家  ›  专栏  ›  技术社区  ›  l0b0

在Bourne shell中查找最大正整数值

  •  3
  • l0b0  · 技术社区  · 14 年前

    我正在检查循环中的计数器,以确定它是否大于某个最大值(如果在可选参数中指定的话)。因为它是可选的,所以我可以将最大值默认为特殊值或最大可能整数。第一个选项需要在每次迭代时进行额外的检查,因此我希望找到 最大整数是什么? -gt Bourne Shell操作 .

    3 回复  |  直到 12 年前
        1
  •  3
  •   pixelbeat    14 年前

    我会避开整数限制,因为它们不可移植且有问题

    $ test 123412341234112341235 -gt 1 || echo bash compares ints
    -bash: test: 123412341234112341235: integer expression expected
    bash compares ints
    $ env test 1 -gt 123412341234112341235 || echo coreutils compares strings
    coreutils compares strings
    

    相反,我会按照你的建议做,做额外的比较,比如:

    [ "$limit" ] && [ $count -gt $limit ]
    
        2
  •  2
  •   anon    14 年前

    BourneShell没有存储或操作数字的功能——所有数据都存储为字符串。如果你问这种事情:

    if [ $x -gt $y ]
    

    然后由一个单独的(在bourne shell中)可执行文件处理 test ,它有一个名为“[”的符号链接。所以你的问题实际上是关于 测试 命令,我能找到的所有文档似乎都很沉默。

        3
  •  2
  •   mivk    12 年前

    在我的系统中,bash的最大整数似乎与perl posix库的long_max常量相同。显然,这在您的平台上会有所不同,以及如何编译bash等,但这似乎是一个很好的测试起点:

    declare -i max=$(perl -MPOSIX -le 'print LONG_MAX')
    
    echo $max
    9223372036854775807
    
    echo "max+1 = " $(( i += 1 ))
    max+1 =  -9223372036854775808
    
    uname -a
    Linux x200s 3.2.0-33-generic #52-Ubuntu SMP Thu Oct 18 16:29:15 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
    

    更新:在旧的32位Linux上尝试了这个方法之后,我发现我的Perl的posix long_max是2147483647,但是bash仍然有相同的限制。它似乎是在/usr/include/limits.h中定义的,并且取决于您的单词大小,即使在32位系统上,它也可能是64位的:

    /* Minimum and maximum values a `signed long int' can hold.  */
    #  if __WORDSIZE == 64
    #   define LONG_MAX     9223372036854775807L
    #  else
    #   define LONG_MAX     2147483647L
    #  endif