Чаще всего причиной ошибки является неверное использование регистра при работе с переменными. Например, при присваивании переменной применяется верхний регистр, а при ссылке на нее — нижний. Тогда не следует удивляться тому, что присваивания значения не происходит.
23.1.5. Циклы for
При работе с циклом for пользователи иногда забывают в части списка указать знак доллара. В результате список воспринимается как строка.
23.1.6. Команда echo
При отладке сценариев чрезвычайно удобно применять команду echo. Добавьте команду echo в наиболее существенных частях сценария, где могут возникнуть какие‑либо затруднения. Например, воспользуйтесь командой echo до и после считывания или изменения значения переменной.
Примените код завершения последней команды для уточнения того, успешно ли была выполнена данная команда. Следует иметь в виду, что команду echo желательно не применять перед кодом завершения последней команды, поскольку в этом случае команда всегда возвратит истинное значение.
23.2. Команда set
При отладке сценария можно использовать команду set. Ниже приведены наиболее часто применяемые отладочные опции команды set.
set -n Считывание, но не выполнение команд set -v Отображение всех строк при считывании set -х Отображение всех команд и их аргументов
Чтобы отключить опцию set, просто замените знак — на знак +. Конечно, привычнее было бы, наоборот, знак + применять для подключения, а знак — использовать для отключения. Но здесь все зависит от привычки.
Команду set можно запустить, начиная с верхней части сценария, и завершить ее выполнение по завершении сценария. Или же можно активизировать эту команду при выполнении определенной блочной конструкции, которая содержит ошибки.
Рассмотрим, как функционирует команда set. Ниже приводится небольшой сценарий, который включает в список переменных определенные имена. Пользователь вводит имя, затем с помощью цикла for просматривается список в поисках соответствия. Обратите внимание, что опция set -x применяется в верхней части сценария, а в нижней части сценария ее действие завершается.
$ pg error
#!/bin/sh
#error
#установка set -x set -x
LIST="Peter Susan John Barry Lucy Norman Bill Leslie"
echo -n "Enter your Name :"
read NAME
for LOOP in $LIST
do
if [ "$LOOP" = "$NAME" ]; then
echo "you're on the list, you're in"
break
fi
done
# отмена установки
set -x
set +x
Выполним сценарий, используя имя, которое отсутствует в списке. При этом поток вывода выглядит следующим образом.
$ error
error
+ error
+ LIST=Peter Susan John Barry Lucy Norman Bill Leslie
+ echo -n Enter your Name :
Enter your Name :+ read NAME
Harry
- [ Peter=Harry ]
+ [ Susan=Harry ]
+ [ John=Harry ]
+ [ Barry=Harry ]
+ [ Lucy=Harry ]
- [ Norman=Harry ]
+ [ Bill=Harry ]
+ [ Leslie=Harry ]
По мере того как цикл for обрабатывает список, полностью отображаются результаты сравнения. Нежелательно применять команду set аналогичным образом, если возникают затруднения при просмотре файлов или на этапе сравнения строк и значений.
23.3. Заключение
При поиске ошибок нужно самостоятельно просматривать сценарии и применять
команду set наряду с набором конструкций echo. ,
ГЛАВА 24
Встроенные команды интерпретатора shell
В предыдущих главах нам уже встречались конструкции, встроенные в интерпретатор shell Напомним, что речь идет о командах, которые не находятся в каталоге /bin или usr/bin, а встроены в интерпретатор Bourne shell. Скорость выполнения встроенных команд выше по сравнению с их эквивалентами в системе (если таковые имеются), В этой главе рассматривается единственная тема: список стандартных встроенных команд интерпретатора Bourne shell.
Например, для выполнения одних и тех же действий можно воспользоваться как системными командами cd и pwd, так и аналогичными командами, встроенными в интерпретатор shell. Чтобы выполнять системную версию команды, кроме ее имени укажите и каталог, в котором она находится:
/bin/pwd
24.1. Полный список команд, встроенных в интерпретатор shell
В табл. 24.1 содержится полный перечень стандартных встроенных команд. Таблица 24.1. Стандартные встроенные команды
:
Нуль, всегда возвращает истинное значение
.
Считывание файлов из текущего интерпретатора shell
break
Применяется в конструкциях for, while, until, case
cd
Изменяет текущий каталог
continue
Продолжает цикл, начиная следующую итерацию
echo
Записывает вывод в стандартный поток вывода
eval
Считывает аргумент и выполняет результирующую команду
exec
Выполняет команду, но не в этом интерпретаторе shell
exit
Выход из интерпретатора shell
export
Экспортирует переменные, вследствие чего они доступны для текущего интерпретатора shell
pwd
Отображает текущий каталог
read
Просматривает строку текста из стандартного потока
readonly
Превращает данную переменную в переменную "только для чтения"
return
Выход из функции с отображением кода возврата
set
Управляет отображением различных параметров для стандартного потока вводных данных
shift
Смещает влево командную строку аргументов
test
Оценивает условное выражение
times
Отображает имя пользователя и системные промежутки времени для процессов, которые выполняются с помощью интерпретатора shell
trap
При получении сигнала выполняет определенную команду
type
Интерпретирует, каким образом интерпретатор shell применяет имя в качестве команды
ulimit
Отображает или устанавливает ресурсы интерпретатора shell
umask
Отображает или устанавливает режимы создания файлов, заданные по умолчанию
unset
Удаляет из памяти интерпретатора shell переменную или функцию
wait
Ожидает окончания дочернего процесса и сообщает о его завершении
Изучим более подробно некоторые команды, которые до сих пор не рассматривались либо рассматривались поверхностно.
24.1.1. Команда pwd
Эта команда отображает текущий каталог:
$ pwd
/tmp
24.1.2. Команда set
Команда set рассматривалась при изучении процесса отладки для подключения и отключения опций. Эту команду можно также использовать для передачи аргументов в пределах сценария. Опишем, как происходит этот процесс. Предположим, что сценарий должен обработать два параметра. Вместо передачи параметров в сценарий выполняют их задание в сценарии. Для этого применяется команда set.