В заключение, для того чтобы сделать сценарий многократно используемым, вам необходимо использовать другое значение кода завершения в том случае, когда применяется образец по умолчанию для непонятного варианта ввода.
#!/bin/sh
echo "Is it -morning? Please answer yes or no"
read timeofday
echo "Good Morning"
exit 0
Как это работает
Для демонстрации другого способа определения соответствия образцу в этом программном коде изменен вариант определения соответствия для ветви no
case
выполняется, как только найдено первое, а не наилучшее соответствие. Если вы поставите ветвь *)
первой, совпадение с этим образцом будет определяться всегда, независимо от варианта введенной строки.Учтите, что сдвоенная точка с запятой ;;
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
Эта конструкция позволяет выполнять последовательность команд, причем каждая последующая выполняется только при успешном завершении предыдущей. Синтаксическая запись такова:
Выполнение операторов начинается с самого левого, если он возвращает значение true
false
(ложь), после чего никакие операторы списка не выполняются. Операция &&
проверяет условие предшествующей команды.Каждый оператор выполняется независимо, позволяя соединять в одном списке множество разных команд, как показано в приведенном далее сценарии. И-список успешно обрабатывается, если все команды выполнены успешно, в противном случае его обработка заканчивается неудачно.
Выполните упражнение 2.9.
В следующем сценарии вы обращаетесь к файлу file_one (для проверки его наличия, и если файл не существует, создаете его) и затем удаляете файл file_two. Далее И-список проверяет наличие каждого файла и между делом выводит на экран кое-какой текст.
#!/bin/sh
touch file_one
rm -f file_two