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