2010-06-03 2 views
3

Я проверяю счетчик в цикле, чтобы определить, превышает ли он какой-либо максимум, если он указан в необязательном параметре. Поскольку это необязательно, я могу либо по умолчанию использовать максимум, либо специальное значение, либо максимально возможное целое число. Первый вариант потребует дополнительной проверки на каждой итерации, поэтому я бы хотел узнать , что представляет собой максимальное целое число, которое будет работать с операцией Bournne Shell.Найти максимальное положительное целочисленное значение в 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 нет средств для хранения или обработки чисел - все хранится в виде строки. Если вы спрашиваете о такого рода вещи:

if [ $x -gt $y ] 

то, что обрабатывается отдельно (в Bourne оболочки) исполняемый файл под названием test, который имеет символическую ссылку с именем «[». Поэтому ваш вопрос действительно о границах команды test, которую все документы, которые я могу найти, кажутся довольно сдержанными.

2

В моей системе максимальное целое число Bash, похоже, совпадает с константой LONG_MAX моей библиотеки Perl POSIX. Очевидно, что это будет зависеть от вашей платформы, и как ваш 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 

Update: После попытки этого на старой 32-битной Linux, Я вижу, что POSIX LONG_MAX от Perl - 2147483647, но у Bash все еще есть тот же предел. Он, как представляется, определен в /usr/include/limits.h и зависит от вашего __WORDSIZE, который может быть 64 бит даже в 32-битных системах:

/* Minimum and maximum values a `signed long int' can hold. */ 
# if __WORDSIZE == 64 
# define LONG_MAX  9223372036854775807L 
# else 
# define LONG_MAX  2147483647L 
# endif 
Смежные вопросы