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

在Bourne Shell中查找最大正整数值,shell,sh,Shell,Sh,我正在检查循环中的计数器,以确定它是否大于某个最大值(如果在可选参数中指定)。因为它是可选的,所以我可以将最大值默认为一个特殊值,也可以默认为可能的最大整数。第一个选项需要在每次迭代时进行额外检查,因此我想找出与-gtBourne Shell操作一起工作的最大整数是多少Bourne Shell没有存储或操作数字的功能-所有内容都存储为字符串。如果你在问这类事情: if [ $x -gt $y ] 然后,它由一个名为test的独立可执行文件(在Bourne shell中)处理,该文件有一个名为[

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

Bourne Shell没有存储或操作数字的功能-所有内容都存储为字符串。如果你在问这类事情:

if [ $x -gt $y ]

然后,它由一个名为
test
的独立可执行文件(在Bourne shell中)处理,该文件有一个名为[”。因此,您的问题实际上是关于
test
命令的限制,我能找到的所有文档似乎都对此保持缄默。

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

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

在我的系统上,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

在macOSX Catalina上Mac:~Erik$uname-aDarwin Mac.local 19.5.0达尔文内核版本19.5.0:Tue May 26 20:41:44 PDT 2020;root:xnu-6153.121.2~2/RELEASE_X86_64 X86_64Mac:~Erik$a=9223372036854775807;echo“a+1=$($a+1));a/(1024x1024x1024x1024x1024)=($a/1073724”)”版本:< /108x1024x1024)=8589934591;<埃里克> $BASH -版本< /代码>代码> GNU BASH,版本3.2.57(1)-版本(X86Y64-APPL-DARWIN 19)<代码> >版权(C)2007免费软件基金会,公司代码< >代码> MAC:~埃里克$ ZSH -版本< /C> >代码> ZSH 5.7.1(x86_64-apple-darwin19.0)