Читать книгу 📗 "Основы программирования в Linux - Мэтью Нейл"
Данный сценарий исправляет наиболее очевидный дефект, а более тонкая проблема остается незамеченной. Запустите новый вариант сценария, но вместо ответа на вопрос просто нажмите клавишу <Enter> (или на некоторых клавиатурах клавишу <Return>). Вы получите сообщение об ошибке:
[: =: unary operator expected
Что же не так? Проблема в первой ветви оператора
if
timeofday
if
<i>if [ = "yes" ]</i>
и не представляла собой верное условие. Во избежание этого следует заключить имя переменной в кавычки:
<i>if [ "$timeofday" = "yes" ]</i>
Теперь проверка с пустой переменной будет корректной:
<i>if [ "" = "yes" ]</i>
Новый сценарий будет таким:
#!/bin/sh
echo "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 1
fi
exit 0
Этот вариант безопасен, даже если пользователь в ответ на вопрос просто нажмет клавишу <Enter>.
Если вы хотите, чтобы команда
echo
printf
echo
echo -е
echo -n
echo -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/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
fud
for
Как упоминалось ранее, цикл
for
Вы уже видели этот прием в первом примере first. В сценарии применялись средства подстановки командной оболочки — символ
*
$file
for
Давайте бегло просмотрим еще один пример подстановки с помощью метасимвола. Допустим, что вы хотите вывести на экран все имена файлов сценариев в текущем каталоге, начинающиеся с буквы "f", и вы знаете, что имена всех ваших сценариев заканчиваются символами .sh. Это можно сделать следующим образом:
#!/bin/sh
for file in $(ls f*.sh); do
lpr $file
done
exit 0
Как это работает
В этом примере показано применение синтаксической конструкции
$(<i>команда</i>)
for
$()