do
echo
echo "Вы предпочитаете $vegetable."
echo ";-))"
echo
break # если 'break' убрать, то получится бесконечный цикл.
done
exit 0
Если в операторе select список in list не задан, то в качестве списка будет использоваться список аргументов ($@), передаваемый сценарию или функции.
Сравните это с поведением оператора цикла
for variable [in list]
в котором не задан список аргументов.
Пример 10-30. Создание меню с помощью select в функции
#!/bin/bash
PS3='Выберите ваш любимый овощ: '
echo
choice_of()
{
select vegetable
# список выбора [in list] отсутствует, поэтому 'select' использует входные аргументы функции.
do
echo
echo "Вы предпочитаете $vegetable."
echo ";-))"
echo
break
done
}
choice_of бобы рис морковь редис томат шпинат
# $1 $2 $3 $4 $5 $6
# передача списка выбора в функцию choice_of()
exit 0
См. так же Пример 34-3.
Глава 11. Внутренние команды
Внутренняя команда -- это команда, которая встроена непосредственно в Bash. Команды делаются встроенными либо из соображений производительности -- встроенные команды исполняются быстрее, чем внешние, которые, как правило, запускаются в дочернем процессе, либо из-за необходимости прямого доступа к внутренним структурам командного интерпретатора.
Действие, когда какая либо команда или сама командная оболочка инициирует (порождает) новый подпроцесс, что бы выполнить какую либо работу, называется ветвлением (forking) процесса. Новый процесс называется "дочерним" (или "потомком"), а породивший его процесс -- "родительским" (или "предком"). В результате и потомок и предок продолжают исполняться одновременно -- параллельно друг другу.
В общем случае, встроенные команды Bash, при исполнении внутри сценария, не порождают новый подпроцесс, в то время как вызов внешних команд, как правило, приводит к созданию нового подпроцесса.
Внутренние команды могут иметь внешние аналоги. Например, внутренняя команда Bash -- echo имеет внешний аналог /bin/echo и их поведение практически идентично.
#!/bin/bash
echo "Эта строка выводится внутренней командой \"echo\"."
/bin/echo "А эта строка выводится внешней командой the /bin/echo."
Ключевое слово (keyword) -- это зарезервированное слово, синтаксический элемент (token) или оператор. Ключевые слова имеют специальное назначение для командного интерпретатора, и фактически являются элементами синтаксиса языка командной оболочки. В качестве примера можно привести "for", "while", "do", "!", которые являются ключевыми (или зарезервированными) словами. Подобно встроенным командам, ключевые слова жестко зашиты в Bash, но в отличие от встроенных команд, ключевые слова не являются командами как таковыми, хотя при этом могут являться их составной частью[ 24 ].
Ввод/вывод
echo
выводит (на stdout) выражение или содержимое переменной (см. Пример 4-1).
echo Hello
echo $a
Для вывода экранированных символов, echo требует наличие ключа -e. См. Пример 5-2.
Обычно, командв echo выводит в конце символ перевода строки. Подавить вывод это символа можно ключом -n.
Команда echo может использоваться для передачи информации по конвейеру другим командам.
if echo "$VAR" | grep -q txt # if [[ $VAR = *txt* ]]
then
echo "$VAR содержит подстроку \"txt\""
fi
Кроме того, команда echo, в комбинации с подстановкой команд может учавствовать в операции присвоения значения переменной.
a=`echo "HELLO" | tr A-Z a-z`
См. так же Пример 12-15, Пример 12-2, Пример 12-32 и Пример 12-33.
Следует запомнить, что команда echo `command` удалит все символы перевода строки, которые будут выведены командой command.
Переменная $IFS обычно содержит символ перевода строки \n, как один из вариантов пробельного символа. Bash разобьет вывод команды command, по пробельным символам, на аргументы и передаст их команде echo, которая выведет эти аргументы, разделенные пробелами.
24
Исключение из правил -- команда time, которая в официальной документации к Bash называется ключевым словом.