Основы программирования в Linux - Страница 20
Данный сценарий исправляет наиболее очевидный дефект, а более тонкая проблема остается незамеченной. Запустите новый вариант сценария, но вместо ответа на вопрос просто нажмите клавишу
[: =: unary operator expectedЧто же не так? Проблема в первой ветви оператора
iftimeofdayifif [ = "yes" ]и не представляла собой верное условие. Во избежание этого следует заключить имя переменной в кавычки:
if [ "$timeofday" = "yes" ]Теперь проверка с пустой переменной будет корректной:
if [ "" = "yes" ]Новый сценарий будет таким:
#!/bin/shecho "Is it morning? Please answer yes or no "read timeofdayif [ "$timeofday" = "yes" ]then echo "Good morning"elif [ "$timeofday" = "no" ]; then echo "Good afternoon"else echo "Sorry, $timeofday not recognized. Enter yes or no " exit 1fiexit 0Этот вариант безопасен, даже если пользователь в ответ на вопрос просто нажмет клавишу
Если вы хотите, чтобы команда
echoprintf echoecho -еecho -necho -n "Is it morning? Please answer yes or no: "Помните о том, что нужно оставлять дополнительный пробел перед закрывающими кавычками, таким образом формируется зазор перед вводимым пользователем ответом, который в этом случае выглядит четче.
Применяйте конструкцию
forСинтаксис этого оператора прост:
for переменная in значенияdo операторыdoneВыполните упражнения 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Как это работает
В этом примере показано применение синтаксической конструкции
$(команда)for$()