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

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

Жанры

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

Учтите, что сдвоенная точка с запятой

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

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

[yY] | [Yy][Ее][Ss])

В

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

Списки

Иногда может понадобиться сформировать последовательность команд. Например, вы хотите выполнить оператор, только если удовлетворяется несколько условий.

if [ -f this_file ]; then

 if [ -f that_file ]; then

if [ -f the_other_file ]; then

echo "All files present, and correct"

fi

 fi

fi

Или вы хотите, чтобы хотя бы одно условие из последовательности условий было истинным.

if [ -f this_file ]; then

 foo="True"

elif [ -f that_file ]; then

 foo="True"

elif [ -f the_other_file ];

 then foo="True"

else

 foo="False"

fi

if ["$foo" = "True" ]; then

 echo "One of the files exists"

fi

Несмотря на то, что это можно реализовать с помощью нескольких операторов

if
, как видите, результаты получаются очень громоздкими. В командной оболочке есть пара специальных конструкций для работы со списками команд: И-список (AND list) и ИЛИ-список (OR list). Обе они часто применяются вместе, но мы рассмотрим синтаксическую запись каждой из них отдельно.

И-cписок

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

оператор1 && оператор2 && оператор3 && ...

Выполнение операторов начинается с самого левого, если он возвращает значение

true
(истина), выполняется оператор, расположенный справа от первого оператора. Выполнение продолжается до тех пор, пока очередной оператор не вернет значение
false
(ложь), после чего никакие операторы списка не выполняются. Операция
&&
проверяет условие предшествующей команды.

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

Выполните упражнение 2.9.

Упражнение 2.9. И-списки

В следующем сценарии вы обращаетесь

к файлу file_one (для проверки его наличия, и если файл не существует, создаете его) и затем удаляете файл file_two. Далее И-список проверяет наличие каждого файла и между делом выводит на экран кое-какой текст.

#!/bin/sh

touch file_one

rm -f file_two

if [ -f file_one ] && echo "hello" [ -f file_two ] && echo " there"

then

 echo "in if"

else

 echo "in else"

fi

exit 0

Попробуйте выполнить сценарий, и вы получите следующий вывод:

hello

in else

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

Команды

touch
и
rm
гарантируют, что файлы в текущем каталоге находятся в известном состоянии. Далее И-список выполняет команду
[ -f file one ]
, которая возвращает значение
true
, потому что вы только что убедились в наличии файла. Поскольку предыдущий оператор завершился успешно, теперь выполняется команда
echo
. Она тоже завершается успешно (
echo
всегда возвращает
true
). Затем выполняется третья проверка
[ -f file_two ]
. Она возвращает значение
false
, т.к. файл не существует. Поскольку последняя команда вернула
false
, заключительная команда
echo
не выполняется. В результате И-список возвращает значение
false
, поэтому в операторе
if
выполняется вариант
else
.

ИЛИ-список

Эта конструкция позволяет выполнять последовательность команд до тех пор, пока одна из них не вернет значение true, и далее не выполняется ничего более. У нее следующая синтаксическая запись:

оператор1 || оператор2 || оператор3 || ...

Операторы выполняются слева направо. Если очередной оператор возвращает значение

false
, выполняется следующий за ним оператор. Это продолжается до тех пор, пока очередной оператор не вернет значение
true
, после этого никакие операторы уже не выполняются.

ИЛИ-список очень похож на И-список, за исключением того, что правило для выполнения следующего оператора — выполнение предыдущего оператора со значением

false
.

Рассмотрим упражнение 2.10.

Упражнение 2.10. ИЛИ-списки

Скопируйте сценарий из предыдущего упражнения и измените затененные строки следующим образом.

#!/bin/sh

rm -f file_one

if [ -f file_one ] || echo "hello" || echo " there" then

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

Тринадцатый VI

NikL
6. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый VI

Газлайтер. Том 23

Володин Григорий Григорьевич
23. История Телепата
Фантастика:
боевая фантастика
попаданцы
аниме
5.40
рейтинг книги
Газлайтер. Том 23

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
6.60
рейтинг книги
Тринадцатый II

Печать Пожирателя

Соломенный Илья
1. Пожиратель
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Печать Пожирателя

Мазохистка

Mrs Superbia
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Мазохистка

Инженер магии

Модезитт Лиланд Экстон
2. Отшельничий остров
Фантастика:
фэнтези
6.25
рейтинг книги
Инженер магии

Хроника

Саксон Анналист
Mediaevalia: средневековые литературные памятники и источники
Научно-образовательная:
история
5.00
рейтинг книги
Хроника

Обратная сторона пути

Панкеева Оксана Петровна
11. Хроники странного королевства
Фантастика:
фэнтези
9.55
рейтинг книги
Обратная сторона пути

Антология советского детектива-38. Компиляция. Книги 1-20

Александров Владимир Григорьевич
Детективы:
криминальные детективы
5.00
рейтинг книги
Антология советского детектива-38. Компиляция. Книги 1-20

Газлайтер. Том 6

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

Тевье-молочник. Повести и рассказы

Шолом- Алейхем
197. Библиотека всемирной литературы
Проза:
классическая проза
7.00
рейтинг книги
Тевье-молочник. Повести и рассказы

Я еще не царь

Дрейк Сириус
25. Дорогой барон!
Фантастика:
юмористическое фэнтези
аниме
попаданцы
5.00
рейтинг книги
Я еще не царь

Филогенез

Фостер Алан Дин
Фантастика:
космическая фантастика
5.00
рейтинг книги
Филогенез

Тетралогия Будущего

Хайнлайн Роберт Энсон
Шедевры фантастики
Фантастика:
боевая фантастика
юмористическая фантастика
7.73
рейтинг книги
Тетралогия Будущего