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

时间:2010-06-03 12:10:49

标签: shell sh

如果在可选参数中指定,我正在循环中检查计数器以确定它是否大于某个最大值。由于它是可选的,我可以将最大值默认为特殊值或最大可能整数。第一个选项需要在每次迭代时进行额外检查,因此我想找出使用-gt Bourne Shell操作的最大整数是多少。

3 个答案:

答案 0 :(得分:3)

由于它们不可移植且存在问题,我将不受整数限制的影响

$ 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 ]

答案 1 :(得分:2)

Bourne shell没有用于存储或操作数字的工具 - 所有内容都存储为字符串。如果你问这种事情:

if [ $x -gt $y ]

然后由一个名为test的单独(在Bourne shell中)可执行文件处理,该可执行文件具有名为'['的符号链接。所以你的问题实际上是关于test命令的限制,我可以找到的所有文档似乎都非常谨慎。

答案 2 :(得分:2)

在我的系统上,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中定义,并依赖于__WORDSIZE,即使在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