Чтение онлайн

на главную

Жанры

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

Купер Мендель

Шрифт:

# Это первая строка комментария

#+ это вторая строка комментария,

#+ это последняя строка комментария.

#* Обратите внимание.

#o Элемент списка.

#> Альтернативный вариант.

while [ "$var1" != "end" ] #> while test "$var1" != "end"

Для создания блочных комментариев, можно использовать конструкцию if-test.

#!/bin/bash

COMMENT_BLOCK=

# Если попробовать

инициализировать эту переменную чем нибудь,

#+ то вы получите неожиданный результат.

if [ $COMMENT_BLOCK ]; then

Блок комментария --

=================================

Это строка комментария.

Это другая строка комментария.

Это еще одна строка комментария.

=================================

echo "Эта строка не выводится."

Этот блок комментария не вызывает сообщения об ошибке! Круто!

fi

echo "Эта строка будет выведена на stdout."

exit 0

Сравните этот вариант создания блочных комментариев со встроенным документом, использующимся для создания блочных комментариев.

С помощью служебной переменной $?, можно проверить -- является ли входной аргумент целым числом.

#!/bin/bash

SUCCESS=0

E_BADINPUT=65

test "$1" -ne 0 -o "$1" -eq 0 2>/dev/null

# Проверка: "равно нулю или не равно нулю".

# 2>/dev/null подавление вывода сообщений об ошибках.

if [ $?
– ne "$SUCCESS" ]

then

echo "Порядок использования: `basename $0` целое_число"

exit $E_BADINPUT

fi

let "sum = $1 + 25" # Будет выдавать ошибку, если $1 не является целым числом.

echo "Sum = $sum"

# Любая переменная может быть проверена таким образом, а не только входные аргументы.

exit 0

Диапазон, возвращаемых функциями значений, 0 - 255 -- серьезное ограничение. Иногда может оказаться весьма проблематичным использование глобальных переменных, для передачи результата из функции. В таких случаях можно порекомендовать передачу результатов работы функции через запись в 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 двух значений, разделенных пробелом.

}

echo

echo "Первое число: "

read first

echo

echo "Второе число: "

read second

echo

retval=`sum_and_product $first $second` # Получить результат.

sum=`echo "$retval" | awk '{print $1}'` # Первое значение (поле).

product=`echo "$retval" | awk '{print $2}'` # Второе значение (поле).

echo "$first + $second = $sum"

echo "$first * $second = $product"

echo

exit 0

Следующая хитрость -- передача массива в функцию, и "возврат" массива из функции.

Передача массива в функцию выполняется посредством записи элементов массива, разделенных пробелами, в переменную, с помощью операции подстановки команды. Получить массив обратно можно, следуя вышеописанной стратегии, через вывод на stdout, а затем, с помощью все той же операции подстановки команды и оператора ( ... )– - записать в массив.

Поделиться:
Популярные книги

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Маяк надежды

Кас Маркус
5. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Маяк надежды

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Сопротивляйся мне

Вечная Ольга
3. Порочная власть
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Сопротивляйся мне

Инквизитор Тьмы 2

Шмаков Алексей Семенович
2. Инквизитор Тьмы
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Инквизитор Тьмы 2

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

Истребители. Трилогия

Поселягин Владимир Геннадьевич
Фантастика:
альтернативная история
7.30
рейтинг книги
Истребители. Трилогия

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Падение Твердыни

Распопов Дмитрий Викторович
6. Венецианский купец
Фантастика:
попаданцы
альтернативная история
5.33
рейтинг книги
Падение Твердыни

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Ох уж этот Мин Джин Хо 2

Кронос Александр
2. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 2

Энфис 6

Кронос Александр
6. Эрра
Фантастика:
героическая фантастика
рпг
аниме
5.00
рейтинг книги
Энфис 6