Интерпретатор командного языка shell. Управляющие конструкции
3. Управляющие
конструкции
Простая команда - это
последовательность слов,
разделенная пробелами. Первое
слово является именем команды,
которая будет выполняться, а
остальные будут переданы ей как
аргументы. Имя команды передается
ей как аргумент номер 0 (т.е. имя
команды является значением $0).
Значение, возвращаемое простой
командой - это ее статус завершения,
если она завершилась нормально, или
(восьмеричное) 200+статус, если она
завершилась аварийно.
Список - это последовательность
одного или нескольких конвейеров,
разделенных символами ;, &, &&
или || и быть может заканчивающаяся
символом ; или &. Из четырех
указанных операций ; и & имеют
равные приоритеты, меньшие, чем у
&& и ||. Приоритеты последних
также равны между собой. Символ ;
означает, что конвейеры будут
выполняться последовательно, а & -
параллельно. Операция && (||)
означает, что список, следующий за
ней будет выполняться лишь в том
случае, если код завершения
предыдущего конвейера нулевой
(ненулевой).
Команда - это либо простая
команда, либо одна из управляющих
конструкций. Кодом завершения
команды является код завершения ее
последней простой команды.
3.1. Цикл ДЛЯ
for <переменная> [ in <набор> ]
do
<список>
done
Если часть in <набор> опущена, то
это означает in "$@" ( то есть in $1
$2 ... $n). Пример. Вывести на экран все
фортранные файлы текущей
библиотеки:
for f in *.for
do
cat $f
done
3.2. Оператор выбора
case $<переменная> in
<шаблон> | <шаблон>... ) <список> ;;
. . .
esac
Оператор выбора выполняет
<список>, соответствующий
первому <шаблону>, которому
удовлетворяет <переменная>.
Форма шаблона та же, что и
используемая для генерации имен
файлов. Часть | шаблон... может
отсутствовать.
Пример. Определить флаги и
откомпилировать все указанные
файлы.
# инициализировать флаг
flag=
# повторять для каждого аргумента
for a
do
case $a in
# об(r)единить флаги, разделив их пробелами
-[ocSO]) flag=$flag' ' $a ;;
-*) echo 'unknown flag $a' ;;
# компилировать каждый исходный файл и сбросить флаги
*.c) cc $flag $a; flag= ;;
*.s) as $flag $a; flag= ;;
*.f) f77 $flag $a; flag= ;;
# неверный аргумент
*) echo 'unexpected argument $a' ;;
esac
done
3.3. Условный оператор.
if <список1>
then
<список2>
[ elif <список3>
then
<список4> ]
. . .
[ else
<список5> ]
fi
Выполняется <список1> и, если
код его завершения 0, то выполняется
<список2>, иначе - <список3> и,
если и его код завершения 0, то
выполняется <список4>. Если же
это не так, то выполняется
<список5>. Части elif и else могут
отсутствовать.
3.4. Цикл ПОКА
while <список1>
do
<список2>
done
До тех пор, пока код завершения
последней команды <списка1> есть
0, выполняются команды <списка2>.
При замене служебного слова while на
until условие выхода из цикла
меняется на противоположное.
В качестве одной из команд
<списка1> может быть команда true
(false). По этой команде не выполняется
никаких действий, а код завершения
устанавливается 0 (-1). Эти команды
применяются для организации
бесконечных циклов. Выход из такого
цикла можно осуществить лишь по
команде break (см. Специальные
команды).
3.5. Функции
<имя> () {
<список>;
}
Определяется функция с именем
<имя>. Тело функции - <список>,
заключенный между { и }.
3.6. Зарезервированные слова
Следующие слова являются
зарезервированными:
if then else elif fi
case in esac { }
for while until do done
3.7. Специальные команды
Как правило, для выполнения
каждой команды shell порождает
отдельный процесс. Специальные
команды отличаются тем, что они
встроены в shell и выполняются в
рамках текущего процесса.
: |
Пустая команда.
Возвращает нулевой код
завершения. |
. file |
Shell читает и
выполняет команды из файла file,
затем завершается; при поиске
file используется список поиска
$PATH. |
break [n] |
Выход из
внутреннего for или while цикла;
если указано n, то выход из n
внутренних циклов. |
continue [n] |
Перейти к
следующей итерации
внутреннего for или while цикла;
если указано n, то переход к
следующей итерации n-ого цикла. |
cd [ <аргумент> ] |
Сменить
текущую директорию на
директорию <аргумент>. По
умолчанию используется
значение HOME. |
echo [ <арг> ... ] |
Выводит свои
аргументы в стандартный вывод,
разделяя их пробелами. |
eval [ <арг> ... ] |
Аргументы
читаются, как если бы они
поступали из стандартного
ввода и рассматриваются как
команды, которые тут же и
выполняются. |
exec [ <арг> ... ] |
Аргументы
рассматриваются как команды
shell'а и тут же выполняются, но
при этом не создается нового
процесса. В качестве
аргументов могут быть указаны
направления ввода-вывода и,
если нет никаких других
аргументов, то будет изменено
лишь направление ввода-вывода
текущей программы. |
exit [ n ] |
Завершение
выполнения shell'а с кодом
завершения n. Если n опущено, то
кодом завершения будет код
завершения последней
выполненной команды (конец
файла также приводит к
завершению выполнения). |
export [ <переменная>
... ] |
Данные
переменные отмечаются для
автоматического экспорта в
окружение (см. Окружение)
выполняемых команд. Если
аргументы не указаны, то
выводится список всех
экспортируемых переменных.
Имена функций не могут
экспортироваться. |
hash [ -r ] [ <команда> ...
] |
Для каждой из
указанных команд определяется
и запоминается путь поиска.
Опция -r удаляет все
запомненные данные. Если не
указан ни один аргумент, то
выводится информация о
запомненных командах: hits -
количество обращений shell'а к
данной команде; cost - объем
работы для обнаружения команды
в списке поиска; command - полное
имя команды. В некоторых
ситуациях происходит
перевычисление запомненных
данных, что отмечается значком
* в поле hits. |
pwd |
Выводит имя текущей
директории. |
read [ <переменная> ...
] |
Читается из
стандартного ввода одна
строка; первое ее слово
присваивается первой
переменной, второе - второй и
т.д., причем все оставшиеся
слова присваиваются последней
переменной. |
readonly [ <переменная>
... ] |
Запрещается
изменение значений указанных
переменных. Если аргумент не
указан , то выводится
информация обо всех переменных
типа readonly. |
return [ n ] |
Выход из функции с
кодом завершения n. Если n
опущено, то кодом завершения
будет код завершения последней
выполненной команды. |
set [ --aefkntuvx [ <арг> ... ]
] |
Команда
устанавливает следующие
режимы: |
-a |
отметить переменные,
которые были изменены или
созданы, как переменные
окружения (см. Окружение) |
-e |
если код завершения
команды ненулевой, то
немедленно завершить
выполнение shell'а |
-f |
запретить генерацию
имен файлов |
-k |
все переменные с
именем помещаются в окружение
команды, а не только те, что
предшествуют имени команды (см.
Окружение) |
-n |
читать команды, но не
выполнять их |
-t |
завершение shell'а после
ввода и выполнения одной
команды |
-u |
при подстановке
рассматривать неустановленные
переменные как ошибки |
-v |
вывести вводимые
строки сразу после их ввода |
-x |
вывести команды и их
аргументы перед их выполнением
|
-- |
не изменяет флаги,
полезен для присваивания
позиционным переменным новых
значений. |
|
При указании + вместо -
каждый из флагов устанавливает
противоположный режим. Набор
текущих флагов есть значение
переменной $-. <арг> - это
значения, которые будут
присвоены позиционным
переменным $1, $2 и т.д. Если все
аргументы опущены, выводятся
значения всех переменных. |
shift [ n ] |
Позиционные
переменные, начиная с $(n+1),
переименовываются в $1 и т.д. По
умолчанию n=1. |
test |
вычисляет
условные выражения (см.
Дополнительные сведения. Test ) |
trap [ <арг> ] [ n ] ... |
Команда
<арг> будет выполнена, когда
shell получит сигнал n (см.
Сигналы). (Надо заметить, что
<арг> проверяется при
установке прерывания и при
получении сигнала). Команды
выполняются по порядку номеров
сигналов. Любая попытка
установить сигнал,
игнорируемый данным процессом,
не обрабатывается. Попытка
прерывания по сигналу 11 (segmentation
violation) приводит к ошибке. Если
<арг> опущен, то все
прерывания устанавливаются в
их начальные значения. Если
<арг> есть пустая строка, то
этот сигнал игнорируется shell'ом
и вызываемыми им программами.
Если n=0, то <арг> выполняется
при выходе из shell'а. Trap без
аргументов выводит список
команд, связанных с каждым
сигналом. |
type [ <имя> ... ] |
Для каждого
имени показывает, как оно будет
интерпретироваться при
использовании в качестве имени
команды: как внутренняя
команда shell'а, как имя файла или
же такого файла нет вообще. |
ulimit [ -f ] [ n ] |
Устанавливает
размер файла в n блоков; -f -
устанавливает размер файла,
который может быть записан
процессом-потомком (читать
можно любые файлы). Без
аргументов - выводит текущий
размер. |
umask [ nnn ] |
Пользовательская
маска создания файлов
изменяется на nnn. Если nnn
опущено, то выводится текущее
значение маски. Пример: после
команды umask 755 будут
создаваться файлы, которые
владелец сможет читать, писать
и выполнять, а все остальные -
только читать и выполнять. |
unset [ <имя> ... ] |
Для каждого
имени удаляет соответствующую
переменную или функцию.
Переменные PATH, PS1, PS2 и IFS не
могут быть удалены. |
wait [ n ] |
Ждет
завершения указанного
процесса и выводит код его
завершения. Если n не указано,
то ожидается завершения всех
активных процессов-потомков и
возвращается код завершения 0. |
Назад | Содержание | Вперед
|