Основы программирования в Linux
Для того чтобы сделать средства установления соответствия образцам более мощными, можно применять следующие строки-образцы:
[yY] | [Yy][Ее][Ss])В них ограничен набор разрешенных букв, но при этом допускаются разнообразные ответы и предлагается более строгий контроль, чем при применении метасимвола
.*СпискиИногда может понадобиться сформировать последовательность команд. Например, вы хотите выполнить оператор, только если удовлетворяется несколько условий.
if [ -f this_file ]; thenif [ -f that_file ]; thenif [ -f the_other_file ]; thenecho "All files present, and correct"fififiИли вы хотите, чтобы хотя бы одно условие из последовательности условий было истинным.
if [ -f this_file ]; thenfoo="True"elif [ -f that_file ]; thenfoo="True"elif [ -f the_other_file ];then foo="True"elsefoo="False"fiif ["$foo" = "True" ]; thenecho "One of the files exists"fiНесмотря на то, что это можно реализовать с помощью нескольких операторов
, как видите, результаты получаются очень громоздкими. В командной оболочке есть пара специальных конструкций для работы со списками команд: И-список (AND list) и ИЛИ-список (OR list). Обе они часто применяются вместе, но мы рассмотрим синтаксическую запись каждой из них отдельно.ifИ-cписокЭта конструкция позволяет выполнять последовательность команд, причем каждая последующая выполняется только при успешном завершении предыдущей. Синтаксическая запись такова:
<i>оператор1 </i><b>&&</b><i> оператор2 </i><b>&&</b><i> оператор3</i> <b>&&</b> ...Выполнение операторов начинается с самого левого, если он возвращает значение
(истина), выполняется оператор, расположенный справа от первого оператора. Выполнение продолжается до тех пор, пока очередной оператор не вернет значениеtrue(ложь), после чего никакие операторы списка не выполняются. Операцияfalseпроверяет условие предшествующей команды.&&Каждый оператор выполняется независимо, позволяя соединять в одном списке множество разных команд, как показано в приведенном далее сценарии. И-список успешно обрабатывается, если все команды выполнены успешно, в противном случае его обработка заканчивается неудачно.
Выполните упражнение 2.9.
Упражнение 2.9. И-спискиВ следующем сценарии вы обращаетесь к файлу file_one (для проверки его наличия, и если файл не существует, создаете его) и затем удаляете файл file_two. Далее И-список проверяет наличие каждого файла и между делом выводит на экран кое-какой текст.
#!/bin/shtouch file_onerm -f file_twoif [ -f file_one ] && echo "hello" [ -f file_two ] && echo " there"thenecho "in if"elseecho "in else"fiexit 0Попробуйте выполнить сценарий, и вы получите следующий вывод:
helloin elseКак это работает
Команды
иtouchгарантируют, что файлы в текущем каталоге находятся в известном состоянии. Далее И-список выполняет командуrm, которая возвращает значение[ -f file one ], потому что вы только что убедились в наличии файла. Поскольку предыдущий оператор завершился успешно, теперь выполняется командаtrue. Она тоже завершается успешно (echoвсегда возвращаетecho). Затем выполняется третья проверкаtrue. Она возвращает значение[ -f file_two ], т.к. файл не существует. Поскольку последняя команда вернулаfalse, заключительная командаfalseне выполняется. В результате И-список возвращает значениеecho, поэтому в оператореfalseвыполняется вариантif.elseИЛИ-списокЭта конструкция позволяет выполнять последовательность команд до тех пор, пока одна из них не вернет значение true, и далее не выполняется ничего более. У нее следующая синтаксическая запись:
<i>оператор1 </i><b>||</b><i> оператор2 </i><b>||</b><i> оператор3 </i><b>||</b><i> ...</i>Операторы выполняются слева направо. Если очередной оператор возвращает значение
, выполняется следующий за ним оператор. Это продолжается до тех пор, пока очередной оператор не вернет значениеfalse, после этого никакие операторы уже не выполняются.trueИЛИ-список очень похож на И-список, за исключением того, что правило для выполнения следующего оператора — выполнение предыдущего оператора со значением
.falseРассмотрим упражнение 2.10.
Упражнение 2.10. ИЛИ-спискиСкопируйте сценарий из предыдущего упражнения и измените затененные строки следующим образом.
#!/bin/sh<i>rm -f file_one</i><i>if [ -f file_one ] || echo "hello" || echo " there" then</i>echo "in if"