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

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Конструкция оператора

case
выглядит слегка устрашающей, но она позволяет довольно изощренным способом сопоставлять содержимое переменной с образцами и затем выполнять разные операторы в зависимости от того, с каким образцом найдено соответствие. Это гораздо проще, чем проверять несколько условий, применяемых во множественных операторах
if
,
elif
и
else
.

Примечание

Обратите внимание на то, что каждая ветвь с образцами завершается удвоенным символом "точка с запятой" (

;;
). В каждой ветви оператора
case
можно поместить несколько операторов, поэтому сдвоенная точка с запятой необходима для отметки завершения очередного оператора и начала следующей ветви с новым образцом в операторе
case
.

Возможность сопоставлять многочисленные образцы и затем выполнять множественные связанные с образцом операторы делают конструкцию

case
очень удобной для обработки пользовательского ввода. Лучше всего увидеть, как работает конструкция
case
на примерах. Мы будем применять ее в упражнениях 2.6–2.8, каждый раз совершенствуя сопоставление с образцами.

Примечание

Применяя конструкцию

case
с метасимволами в образцах, такими как
*
, будьте особенно внимательны. Проблема заключается в том, что принимается во внимание первое найденное соответствие образцу, несмотря на то, что в последующих ветвях могут быть образцы с более точным соответствием.

Упражнение 2.6. Вариант 1: пользовательский ввод

Вы можете написать новую версию сценария проверки пользовательского ввода с помощью конструкции

case
, сделав сценарий немного более избирательным и терпимым к неожиданным вариантам ввода.

#!/bin/sh

echo "Is it morning? Please answer yes or no "

read timeofday

case "$timeofday" in

 yes) echo "Good Morning";;

 no ) echo "Good Afternoon";;

 y ) echo "Good Morning";;

 n ) echo "Good Afternoon";;

 * ) echo "Sorry, answer not recognized";;

esac

exit 0

Как это работает

Когда выполняется оператор

case
, он берет содержимое переменной
timeofday
и сравнивает его поочередно с каждой строкой-образцом. Как только строка совпадает с введенной информацией, оператор
case
выполняет код, следующий за
)
, и завершается.

Оператор

case
выполняет обычную подстановку в строках, которые он использует для сравнения. Следовательно, вы можете задать часть строки с последующим метасимволом
*
. Применение единственного символа
*
будет соответствовать совпадению с любой введенной строкой, поэтому поместите этот вариант после всех остальных образцов строк для того, чтобы задать некоторое стандартное поведение оператора
case
, если не будут найдены совпадения с другими строками-образцами. Это возможно, потому что оператор
case
сравнивает с каждой строкой-образцом поочередно. Он не ищет наилучшее соответствие, а всего лишь первое встретившееся. Условие, принятое по умолчанию, часто оказывается невыполнимым, поэтому применение метасимвола 
*
может помочь в отладке сценариев.

Упражнение 2.7. Вариант 3: объединение образцов

Предыдущая версия конструкции case, безусловно, элегантнее варианта с множественными операторами

if
, но, объединив все образцы, можно создать более красивую версию.

#!/bin/sh

echo "Is it morning? Please answer yes or no "

read timeofday

case "$timeofday" in

 yes | y | Yes | YES ) echo "Good Morning";;

 n* | N*) echo "Good Afternoon";;

 * ) echo "Sorry, answer not recognized";;

esac

exit 0

Как это работает

Данный сценарий в операторе

case
использует несколько строк-образцов в каждой ветви, таким образом,
case
проверяет несколько разных строк для каждого возможного оператора. Этот прием делает сценарий короче и, как показывает практика, облегчает его чтение. Приведенный программный код также показывает, как можно использовать метасимвол
*
, несмотря на то, что он может соответствовать непредусмотренным образцам. Например, если пользователь введет строку
never
, она будет соответствовать образцу
n*
, и на экран будет выведено приветствие Good Afternoon (Добрый день), хотя такое поведение в сценарии не предусматривалось. Учтите также, что заключенный в кавычки знак подстановки
*
не действует.

Упражнение 2.8. Вариант 3: выполнение нескольких операторов

В заключение, для того чтобы сделать сценарий многократно используемым, вам необходимо использовать другое значение кода завершения в том случае, когда применяется образец по умолчанию для непонятного варианта ввода.

#!/bin/sh

echo "Is it -morning? Please answer yes or no"

read timeofday

case "$timeofday" in

 yes | y | Yes | YES )

echo "Good Morning"

echo "Up bright and early this morning"

;;

 [nN]*)

echo "Good Afternoon"

;;

 *)

echo "Sorry, answer not recognized"

echo "Please answer yes or no"

exit 1

;;

esac

exit 0

Как это работает

Для демонстрации другого способа определения соответствия образцу в этом программном коде изменен вариант определения соответствия для ветви

no
. Также видно, как в каждой ветви оператора case может выполняться несколько операторов. Следует быть внимательным и располагать в операторе самые точные образцы строк первыми, а самые общие варианты образцов последними. Это очень важно, потому что оператор
case
выполняется, как только найдено первое, а не наилучшее соответствие. Если вы поставите ветвь
*)
первой, совпадение с этим образцом будет определяться всегда, независимо от варианта введенной строки.

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

Меткий стрелок. Том II

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

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

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

Наследие Маозари 8

Панежин Евгений
8. Наследие Маозари
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
постапокалипсис
рпг
фэнтези
эпическая фантастика
5.00
рейтинг книги
Наследие Маозари 8

Кодекс Крови. Книга ХVI

Борзых М.
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Крови. Книга ХVI

Кодекс Охотника. Книга XXVII

Винокуров Юрий
27. Кодекс Охотника
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Кодекс Охотника. Книга XXVII

Камень. Книга шестая

Минин Станислав
6. Камень
Фантастика:
боевая фантастика
7.64
рейтинг книги
Камень. Книга шестая

Рассвет русского царства. Книга 2

Грехов Тимофей
2. Новая Русь
Фантастика:
альтернативная история
попаданцы
историческое фэнтези
5.00
рейтинг книги
Рассвет русского царства. Книга 2

Бастард Императора. Том 2

Орлов Андрей Юрьевич
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бастард Императора. Том 2

Я уже граф. Книга VII

Дрейк Сириус
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже граф. Книга VII

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Товарищ "Чума" 5

lanpirot
5. Товарищ "Чума"
Фантастика:
городское фэнтези
попаданцы
альтернативная история
5.00
рейтинг книги
Товарищ Чума 5

Вечный. Книга I

Рокотов Алексей
1. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга I

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Бастард Императора. Том 14

Орлов Андрей Юрьевич
14. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 14