2010-06-03 64 views
3

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

回答

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

Bourne shell没有用于存储或操作数字的设施 - 所有内容均以字符串形式存储。如果你问这样的事情:

if [ $x -gt $y ] 

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

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