Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Данный сценарий исправляет наиболее очевидный дефект, а более тонкая проблема остается незамеченной. Запустите новый вариант сценария, но вместо ответа на вопрос просто нажмите клавишу <Enter> (или на некоторых клавиатурах клавишу <Return>). Вы получите сообщение об ошибке:
[: =: unary operator expectedЧто же не так? Проблема в первой ветви оператора
iftimeofdayif<i>if [ = "yes" ]</i>и не представляла собой верное условие. Во избежание этого следует заключить имя переменной в кавычки:
<i>if [ "$timeofday" = "yes" ]</i>Теперь проверка с пустой переменной будет корректной:
<i>if [ "" = "yes" ]</i>Новый сценарий будет таким:
#!/bin/shecho "Is it morning? Please answer yes or no "read timeofday<i>if [ "$timeofday" = "yes" ]</i>then echo "Good morning"elif [ "$timeofday" = "no" ]; then echo "Good afternoon"else<i> echo "Sorry, $timeofday not recognized. Enter yes or no "</i> exit 1fiexit 0Этот вариант безопасен, даже если пользователь в ответ на вопрос просто нажмет клавишу <Enter>.
Если вы хотите, чтобы команда
echoprintf echoecho -еecho -necho -n "Is it morning? Please answer yes or no: "Помните о том, что нужно оставлять дополнительный пробел перед закрывающими кавычками, таким образом формируется зазор перед вводимым пользователем ответом, который в этом случае выглядит четче.
Применяйте конструкцию
forСинтаксис этого оператора прост:
<b>for</b> <i>переменная </i><b>in</b> <i>значения</i><b>do</b><i> операторы</i><b>done</b>Выполните упражнения 2.4 и 2.5.
forВ командной оболочке значения обычно представлены в виде строк, поэтому можно написать следующий сценарий:
#!/bin/shfor foo in bar fud 43do echo $foodoneexit 0В результате будет получен следующий вывод:
barfud43Что произойдет, если вы измените первую строку с
for foo in bar fud 43for foo in "bar fud 43"Как это работает
В данном примере создается переменная
fooforfudforКак упоминалось ранее, цикл
forВы уже видели этот прием в первом примере first. В сценарии применялись средства подстановки командной оболочки — символ
*$fileforДавайте бегло просмотрим еще один пример подстановки с помощью метасимвола. Допустим, что вы хотите вывести на экран все имена файлов сценариев в текущем каталоге, начинающиеся с буквы "f", и вы знаете, что имена всех ваших сценариев заканчиваются символами .sh. Это можно сделать следующим образом:
#!/bin/shfor file in $(ls f*.sh); do lpr $filedoneexit 0Как это работает
В этом примере показано применение синтаксической конструкции
$(<i>команда</i>)for$()