Найти максимальное положительное целое значение в Bourne Shell - PullRequest
3 голосов
/ 03 июня 2010

Я проверяю счетчик в цикле, чтобы определить, больше ли он какого-либо максимума, если он указан в необязательном параметре. Поскольку это необязательно, я могу по умолчанию задать максимальное значение для специального значения или максимально возможное целое число. Первый вариант потребует дополнительной проверки на каждой итерации, поэтому я хотел бы вместо этого выяснить , какое максимальное целое число будет работать с операцией -gt Bourne Shell .

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Я бы держался подальше от целочисленных ограничений, поскольку они непереносимы и проблематичны

$ 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 голосов
/ 25 ноября 2012

В моей системе максимальное целое число 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

Обновление: Попробовав это на старом 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
2 голосов
/ 03 июня 2010

Оболочка Bourne не имеет средств для хранения или манипулирования числами - все хранится в виде строки. Если вы спрашиваете об этом:

if [ $x -gt $y ]

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

...