Искусство программирования на языке сценариев командной оболочки




Программирование на языке сценариев командной оболочки - стр. 287


Иногда может оказаться весьма проблематичным использование глобальных переменных, для передачи результата из функции. В таких случаях можно порекомендовать передачу результатов работы функции через запись в stdout.

Пример 33-10. Необычный способ передачи возвращаемого значения

#!/bin/bash # multiplication.sh

multiply () # Функции выполняет перемножение всех переданых аргументов. { local product=1

until [ -z "$1" ] # Пока не дошли до последнего аргумента... do let "product *= $1" shift done

echo $product # Значение не будет выведено на экран, } #+ поскольку оно будет записано в переменную.

mult1=15383; mult2=25211 val1=`multiply $mult1 $mult2` echo "$mult1 X $mult2 = $val1" # 387820813

mult1=25; mult2=5; mult3=20 val2=`multiply $mult1 $mult2 $mult3` echo "$mult1 X $mult2 X $mult3 = $val2" # 2500

mult1=188; mult2=37; mult3=25; mult4=47 val3=`multiply $mult1 $mult2 $mult3 $mult4` echo "$mult1 X $mult2 X $mult3 X mult4 = $val3" # 8173300

exit 0

Такой прием срабатывает и для строковых значений. Таким образом, функция может "возвращать" и нечисловой результат.

capitalize_ichar () # Первый символ всех строковых аргументов { #+ переводится в верхний регистр.

string0="$@" # Принять все аргументы.

firstchar=${string0:0:1} # Первый символ. string1=${string0:1} # Остаток строки.

FirstChar=`echo "$firstchar" | tr a-z A-Z` # Преобразовать в верхний регистр.

echo "$FirstChar$string1" # Выдать на stdout.

}

newstring=`capitalize_ichar "each sentence should start with a capital letter."` echo "$newstring" # Each sentence should start with a capital letter.

Используя этот прием, функция может "возвращать" даже несколько значений.

Пример 33-11. Необычный способ получения нескольких возвращаемых значений

#!/bin/bash # sum-product.sh # Функция может "возвращать" несколько значений.

sum_and_product () # Вычисляет сумму и произведение аргументов. { echo $(( $1 + $2 )) $(( $1 * $2 )) # Вывод на stdout двух значений, разделенных пробелом. }




Содержание  Назад  Вперед