Литмир - Электронная Библиотека

Чаще всего причиной ошибки является неверное использование регистра при работе с переменными. Например, при присваивании переменной применяется верхний регистр, а при ссылке на нее — нижний. Тогда не следует удивляться тому, что присваивания значения не происходит.

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.

88
{"b":"273485","o":1}