Для того чтобы сделать средства установления соответствия образцам более мощными, можно применять следующие строки-образцы:
[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 fifiИли вы хотите, чтобы хотя бы одно условие из последовательности условий было истинным.
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"fiif ["$foo" = "True" ]; then echo "One of the files exists"fiНесмотря на то, что это можно реализовать с помощью нескольких операторов
ifЭта конструкция позволяет выполнять последовательность команд, причем каждая последующая выполняется только при успешном завершении предыдущей. Синтаксическая запись такова:
<i>оператор1 </i><b>&&</b><i> оператор2 </i><b>&&</b><i> оператор3</i> <b>&&</b> ...
Выполнение операторов начинается с самого левого, если он возвращает значение
truefalse&&Каждый оператор выполняется независимо, позволяя соединять в одном списке множество разных команд, как показано в приведенном далее сценарии. И-список успешно обрабатывается, если все команды выполнены успешно, в противном случае его обработка заканчивается неудачно.
Выполните упражнение 2.9.
В следующем сценарии вы обращаетесь к файлу file_one (для проверки его наличия, и если файл не существует, создаете его) и затем удаляете файл file_two. Далее И-список проверяет наличие каждого файла и между делом выводит на экран кое-какой текст.
#!/bin/shtouch file_onerm -f file_twoif [ -f file_one ] && echo "hello" [ -f file_two ] && echo " there"then echo "in if"else echo "in else"fiexit 0Попробуйте выполнить сценарий, и вы получите следующий вывод:
helloin elseКак это работает
Команды
touchrm[ -f file one ]trueechoechotrue[ -f file_two ]falsefalseechofalseifelseЭта конструкция позволяет выполнять последовательность команд до тех пор, пока одна из них не вернет значение true, и далее не выполняется ничего более. У нее следующая синтаксическая запись:
<i>оператор1 </i><b>||</b><i> оператор2 </i><b>||</b><i> оператор3 </i><b>||</b><i> ...</i>Операторы выполняются слева направо. Если очередной оператор возвращает значение
falsetrueИЛИ-список очень похож на И-список, за исключением того, что правило для выполнения следующего оператора — выполнение предыдущего оператора со значением
falseРассмотрим упражнение 2.10.
Скопируйте сценарий из предыдущего упражнения и измените затененные строки следующим образом.
#!/bin/sh<i>rm -f file_one</i><i>if [ -f file_one ] || echo "hello" || echo " there" then</i> echo "in if"