Пример 22-6. Сравнение двух больших целых чисел

Пример 22-6. Сравнение двух больших целых чисел

#!/bin/bash

# max2.sh: Наибольшее из двух БОЛЬШИХ целых чисел.

# Это модификация предыдущего примера "max.sh",

# которая позволяет выполнять сравнение больших целых чисел.

EQUAL=0 # Если числа равны.

MAXRETVAL=255 # Максимально возможное положительное число, которое может вернуть функция.

E_PARAM_ERR=-99999 # Код ошибки в параметрах.

E_NPARAM_ERR=99999 # "Нормализованный" код ошибки в параметрах.

max2 () # Возвращает наибольшее из двух больших целых чисел.

{

if [ -z "$2" ]

then

return $E_PARAM_ERR

fi

if [ "$1" -eq "$2" ]

then

return $EQUAL

else

if [ "$1" -gt "$2" ]

then

retval=$1

else

retval=$2

fi

fi

# -------------------------------------------------------------- #

# Следующие строки позволяют "обойти" ограничение

if [ "$retval" -gt "$MAXRETVAL" ] # Если больше предельного значения,

then # то

let "retval = (( 0 - $retval ))" # изменение знака числа.

# (( 0 - $VALUE )) изменяет знак числа.

fi

# Функции имеют возможность возвращать большие *отрицательные* числа.

# -------------------------------------------------------------- #

return $retval

}

max2 33001 33997

return_val=$?

# -------------------------------------------------------------------------- #

if [ "$return_val" -lt 0 ] # Если число отрицательное,

then # то

let "return_val = (( 0 - $return_val ))" # опять изменить его знак.

fi # "Абсолютное значение" переменной $return_val.

# -------------------------------------------------------------------------- #

if [ "$return_val" -eq "$E_NPARAM_ERR" ]

then # Признак ошибки в параметрах, при выходе из функции так же поменял знак.

echo "Ошибка: Недостаточно аргументов."

elif [ "$return_val" -eq "$EQUAL" ]

then

echo "Числа равны."

else

echo "Наиболшее число: $return_val."

fi

exit 0

См. также Пример A-8.

Упражнение: Используя только что полученные знания, добавьте в предыдущий пример, преобразования чисел в римскую форму записи, возможность обрабатывать большие числа.

Перенаправление

Перенаправление ввода для функций

Функции -- суть есть блок кода, а это означает, что устройство stdin для функций может быть переопределено (перенаправление stdin) (как в Пример 3-1).