l0b0
l0b0

Reputation: 58828

Find maximum positive integer value in Bourne Shell

I'm checking a counter in a loop to determine if it's larger than some maximum, if specified in an optional parameter. Since it's optional, I can either default the maximum to a special value or to the maximum possible integer. The first option would require an extra check at each iteration, so I'd like to instead find out what is the maximum integer that will work with the -gt Bourne Shell operation.

Upvotes: 4

Views: 12709

Answers (3)

mivk
mivk

Reputation: 14864

On my system, the maximum integer of Bash seems to be the same as the LONG_MAX constant of my Perl POSIX library. Obviously, this will vary on your platform, and how your Bash was compiled, etc. But that seems to be a good starting point for testing it:

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

Update: After trying this on an old 32 bit Linux, I see that my Perl's POSIX LONG_MAX is 2147483647, but that Bash still has the same limit. It seems to be defined in /usr/include/limits.h, and to depend on your __WORDSIZE, which may be 64 bits even on 32 bit systems :

/* Minimum and maximum values a `signed long int' can hold.  */
#  if __WORDSIZE == 64
#   define LONG_MAX     9223372036854775807L
#  else
#   define LONG_MAX     2147483647L
#  endif

Upvotes: 3

pixelbeat
pixelbeat

Reputation: 31728

I'd stay clear of integer limits as they're non portable and problematic

$ 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

Instead I'd just do as you suggest and do the extra comparison like:

[ "$limit" ] && [ $count -gt $limit ]

Upvotes: 3

anon
anon

Reputation:

The Bourne shell has no facilities for storing or manipulating numbers - everything is stored as a string. If you are asking about this kind of thing:

if [ $x -gt $y ]

then that is handled by a separate (in the Bourne shell) executable called test, which has a symbolic link called '['. So your question is really about the limits of the test command, which all the docs I can find seem quite reticent about.

Upvotes: 1

Related Questions