и не представляла собой верное условие. Во избежание этого следует заключить имя переменной в кавычки:
Теперь проверка с пустой переменной будет корректной:
Новый сценарий будет таким:
#!/bin/sh
echo "Is it morning? Please answer yes or no "
read timeofday
then
echo "Good morning"
elif [ "$timeofday" = "no" ]; then
echo "Good afternoon"
else
exit 1
fi
exit 0
Этот вариант безопасен, даже если пользователь в ответ на вопрос просто нажмет клавишу
Если вы хотите, чтобы команда echo
printf
echo
. В некоторых командных оболочках применяется команда echo -е
, но она поддерживается не всеми системами. В оболочке bash для запрета перехода на новую строку допускается команда echo -n
, поэтому, если вы уверены, что вашему сценарию придется трудиться только в оболочке bash, предлагаем вам использовать следующий синтаксис:echo -n "Is it morning? Please answer yes or no: "
Помните о том, что нужно оставлять дополнительный пробел перед закрывающими кавычками, таким образом формируется зазор перед вводимым пользователем ответом, который в этом случае выглядит четче.
Применяйте конструкцию for
Синтаксис этого оператора прост:
for
do
done
Выполните упражнения 2.4 и 2.5.
for
В командной оболочке значения обычно представлены в виде строк, поэтому можно написать следующий сценарий:
#!/bin/sh
for foo in bar fud 43
do
echo $foo
done
exit 0
В результате будет получен следующий вывод:
bar
fud
43
Что произойдет, если вы измените первую строку с for foo in bar fud 43
for foo in "bar fud 43"
? Напоминаем, что вставка кавычек заставляет командную оболочку считать все, что находится между ними, единой строкой. Это один из способов сохранения пробелов в переменной.Как это работает
В данном примере создается переменная foo
for
присваиваются разные значения. Поскольку оболочка считает по умолчанию все переменные строковыми, применять строку 43 так же допустимо, как и строку fud
.for
Как упоминалось ранее, цикл for
Вы уже видели этот прием в первом примере first. В сценарии применялись средства подстановки командной оболочки — символ *
$file
внутри цикла for
.Давайте бегло просмотрим еще один пример подстановки с помощью метасимвола. Допустим, что вы хотите вывести на экран все имена файлов сценариев в текущем каталоге, начинающиеся с буквы "f", и вы знаете, что имена всех ваших сценариев заканчиваются символами .sh. Это можно сделать следующим образом:
#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
exit 0
Как это работает