如果在可选参数中指定,我正在循环中检查一个计数器以确定它是否大于某个最大值。由于它是可选的,我可以将最大值默认为一个特殊值或最大可能的整数。第一个选项需要在每次迭代时进行额外检查,因此我想找出可用于Bourne Shell 操作的最大整数是多少-gt
。
问问题
12146 次
3 回答
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 ]
于 2010-06-03T14:43:17.127 回答
3
在我的系统上,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
于 2012-11-25T18:18:43.400 回答
1
Bourne shell 没有存储或操作数字的工具——所有内容都存储为字符串。如果你问这种事情:
if [ $x -gt $y ]
然后由一个名为 的单独(在 Bourne shell 中)可执行文件处理,test
该可执行文件具有一个名为“[”的符号链接。所以你的问题实际上是关于test
命令的限制,我能找到的所有文档似乎都非常沉默。
于 2010-06-03T12:28:28.367 回答