Командный интерпритатор, скрипты, спецсимволы, команды...

Поводом для написания данного документа стала необходимость разобраться в том как написать скрипт запуска(см. DHCP сервер). Что повлекло за собой необходимость углубить свои познания в правилах использования команд. Ниже речь пойдет о том как и какие комады могдут использоваться для написания скриптов и в поседневной работе. Приоритетным однако является освещение написания скриптов.

Источники информации указаны в конце статьи. Основным источником стал материал рассылки http://www.subscribe.ru «Страницы справочного руководства ОС Uinux на русском». Здесь приведены лишь основные моменты по использованию команд. Если вы хотите разобраться детально или вам кажется что материал изложен нелогично и отрывочно, то вам предстоит найти серьезную и толстую книжку по этому вопросу. На мой взгля в большинстве случаев книга лучше ее электронного аналога. Речь конечно идет о качественных изданиях.

Команда – набор определенной комбинации символов завершающихся Enter. Команды выполняются интерпритатором. Из простых команд строятся более сложные конструкции: конвейеры и списки.

Конвейер - это последовательность одной или более команд, разделенных |. Стандартный выходной поток каждой команды, кроме последней, соединяется при помощи программного канала со стандартным входным потоком следующей команды. Каждая команда выполняется как отдельный процесс; интерпретатор ожидает окончания последней команды. Статусом выхода конвейера является статус выхода его последней команды. Вот пример простого конвейера: $ ls | tee save | wc

<конвейер> ::= <команда> {| <команда>}

Список - это последовательность одного или более конвейеров, разделенных ;, &, && или || и, возможно, заканчивающаяся ; или &.

Таблица назначение разделителей

Приоретет выполнения
Разделитель
Интерпретация
-
|
Конвейер см. выше
0
()
Выполнить в порожденном интерпритаторе
0
{}
Группировка команд (аналог системного вызова exec)
1
&&
Следующий список выполняется только в случае успешного выполнения предыдущего (то есть предыдущий имеет нулевой статус выхода) p1&&p2
1
||
Следующий список выполняется только тогда когда предыдущий процесс завершился неудачно (то есть предыдущий имел не нулевой статус выхода) p1||p2
2
;
Последовательное выполнение предшествующего конвейера (т.е. командный интерпретатор ожидает окончания конвейера перед выполнением любых команд, следующих за точкой с запятой). Может быть любое количесвто.
2
&
вызывает асинхронное выполнение предшествующего конвейера (т.е. командный интерпретатор не ожидает окончания работы конвейера).

Символы специального назначения (метасимволы)
Обрабатываются в несколько проходов до начала выполнения реальных программ.

Метасимволы командного интерпретатора

Метасимвол
Интерпретация
>
prog>file - переключить стандартный выходной поток в файл
>>
prog>>file - добавить стандартный выходной поток к файлу
<
prog<file - извлечь стандартный входной поток из файла
|
p1 | p2 - передать стандартный выходной поток p1 как стандартный входной поток p2
<<str
"Документ здесь": стандартный входной поток задается в последующих строках до строки, состоящей только из символов str. По умолчанию в данных интерпретируются метасимволы \, $ и ``. Если необходимо предотвратить в данных интерпретацию всех метасимволов, необходимо экранировать строку str, предварив обратной косой или взяв в двойные или одиночные кавычки.
*
Задает в имени файла любую строку из нуля или более символов
?
Задает любой символ в имени файла
[abc]
Задает любой символ из [abc] в имени файла, при этом допускаются диапазоны, задаваемые при помощи дефиса -. Если первым символом после [ является !, с этой конструкцией сопоставляется любой символ, не входящий в квадратные скобки.
;
Разделитель команд: p1; p2 - выполнить p1, затем p2.
&
Выполняет предшествующую команду в фоновом режиме
`...`
Инициирует выполнение команд(ы) в ...; `...` заменяется на полученный в результате выполнения стандартный выходной поток
$1,$2,...$9
Заменяются аргументами командного файла
$var
Значение переменной (ключевого параметра) var в сеансе
${var}
Значение var: исключает коллизии в случае конкатенации переменной с последующим текстом
\
\c - использовать непосредственно символ c, \перевод строки - отбрасывается
'...'
Непосредственное использование того, что в кавычках
"..."
Непосредственное использование, но после того, как будут интерпретированы метасимволы $, `...` и \
#
Начало комментария
#!/путь
Стандартное начало скрипта

 

Создание сценариев
Если приходится часто выполнять определенную последовательность действий то для экономии времени логично ее оформить в виде скрипта. То есть отдельного файла, его надо объявить исполняемым. У скрипта есть стандартное начало:
#!/полный_путь_к_программе опции
Программы интерпритаторы могут быть самые различные sh, bash, Perl.
Для получения доступ к имени файла-аргумента используются позиционные параметры.
Таблица Позиционные и специальные параметры командного интерпретатора

Параметр
Назначение
$0
Имя выполняемой команды
$1,$2,...$9
Заменяются аргументами командного файла
$#
Количество аргументов
$*
Все аргументы, передаваемые интерпретатору. "$*" является единым словом, образованным из всех аргументов, объединенных вместе с пробелами.
$@
Аналогично $*. "$@" идентично аргументам: пробелы в аргументах игнорируются, и получается список слов, идентичных исходным аргументам.
$-
Флаги, установленные в интерпретаторе.
$?
Значение, возвращенное последней выполненной командой (статус выхода).
$$
Номер процесса интерпретатора.
$!
Номер процесса последней команды, запущенной асинхронно с помощью &.

 

Операторы

Оператор
Коментарий
=
Присваивание. Без пробелов, если в значении содержаться пробелы, то их стоит взять в кавычки. var=value
Export
Экспортирование переменной из процесса в среду. Для просмотра значений всех переменных среды предназначена команда env.
Напрмер
$ x=Hello
$ export x
$ echo $x
Hello
For

цикл for - цикл по списку слов. Синтаксис
<цикл for> ::= for <имя переменной> [in <список слов>] do <команды> done
<список слов> ::= <слово>{<пробел> <слово>}
<команды> ::= <команда> {<; или перевод строки> <команда>}

for i in 1 2 3 4 5
do
echo $i
done

Может порождаться динамически например имена файлов:
for i in *.c *.h
do
echo $i
done | pr -h "diff `pwd`/old `pwd`" | lp &

или порождать командой:
for i in `pick *.c *.h`
do
echo $i:
done | pr | lp

While
Оператор цикла. Выполняется пока истина то есть последняя операция закончилась с результатом ноль (истина). Синтаксис:

<оператор while> ::= while <команды> do <команды> done
Until
Оператор цикла. Выполняется пока ложь то есть последняя операция закончилась с результатом не ноль (ложь) Синтаксис:

<оператор until> ::= until <команды> do <команды> done
Case
Оператор выбора блока команд в зависимости от условия: Синтаксис:

<оператор выбора> ::=

case <слово> in
<описание варианта> ) <команды> ;;
{<описание варианта> ) <команды> ;; }
esac

где:
<описание варианта> ::= <шаблон> { | <шаблон>}
<команды> ::= <команда> {<разделитель> <команда>}
<разделитель> ::= <перевод строки> | ;

if
Оператор условия. Истиной в данном случае ситуация когда команда заканчивается с результатом ноль Синтаксис
<условный оператор> ::=

if <команды> then <команды>
{elif <команды> then <команды>}
[else <команды>]
fi
Read
Запрос информации у пользователя. Пример read greeting. В данном случае вводимое значение занесется в переменныю greeting.
test
Проверка условия. Об этом операторе стоит рассказать подробнее.

Оператор test
Cинтаксис: <команда test> ::= test <выражение> | [ <выражение> ]
При построении могут использоваться конструкции на основе:
! Унарный оператор отрицания.
-a Бинарный оператор "и".
-o Бинарный оператор "или".
(<выражение>) Скобки для группировки. Учтите, что скобки распознаются командным интерпретатором, поэтому их надо брать в кавычки.

Примитив
Условие
-r файл
файл существует и доступен для чтения
-w файл
файл существует и доступен для записи
-x файл

файл существует и является выполняемым
-f файл
истина, если файл существует и является обычным файлом (не каталогом)
-d файл

файл существует и является каталогом
-h файл
файл существует и является символьной связью
-s файл
файл существует и не пуст
-t [ дескриптор ]
истина, если открытый файл с указанным дескриптором (по умолчанию, 1) ассоциирован с терминалом
-z s1
истина, если строка s1 имеет нулевую длину
-n s1
истина, если строка s1 имеет ненулевую длину
s1 = s2
истина, если строки s1 и s2 идентичны
s1 != s2
истина, если строки s1 и s2 не совпадают
s1
истина, если строка s1 непустая
n1 -eq n2
сравнение целых чисел на равенство (=). Можно использовать также и другие сравнения: -ne (!=), -gt (>), -ge (>=), -lt (<) и -le (<=).

Рассмотрим пример использования условного оператора и команды test:
$ cat which
# which cmd: Безопасная версия сценария для выдачи каталога,
# из которого будет вызываться выполняемая программа

opath=$PATH
PATH=/usr/bin

# Это гарантирует использование настоящих команд
# echo, sed и test в любом случае!

case $# in
0) echo 'Usage: which command' 1>&2; exit 2
esac

for i in `echo $opath | sed 's/^:/.:/
                                      s/::/:.:/g
                                     s/:$/:./
                                     s/:/ /g'`
do
if test -x $i/$1
then
echo $i/$1
exit 0 # команда найдена
fi
done
exit 1 # не найдена
$ which sed
./sed
$ which which
./which

Встроенные переменные командного интерпретатора

Переменная
Значение
$HOME
Начальный каталог пользователя.
$PATH
Путь для поиска выполняемых команд.
$CDPATH
Путь поиска для команды cd.
$IFS
Список символов, разделяющих слова в аргументах
$MAIL
Файл почтового ящика. Командный интерпретатор информирует пользователя о получении почты в указанный файл.
$MAILCHECK
Эта переменная определяет, как часто (в секундах) интерпретатор будет проверять поступление почты в файл, определяемый переменной MAIL. По умолчанию принято значение 600 секунд. При установке в 0, интерпретатор будет проверять почту перед каждой выдачей строки-приглашения.
$PS1
Строка-приглашение, по умолчанию принята '$ '
$PS2
Строка-приглашение при продолжении командной строки, по умолчанию принята '> '

Использованные источники
1. http://www.subscribe.ru «Страницы справочного руководства Linux».
2. Использование Linux 6-е издание Девид Бендел, Роберт Нейпир;
3. Материалы форума www.Linux.ru
4 . "Как написать скрипт загрузки" http://linuxportal.ru/forums/index.php/f/48/

Автор:Алекс

 
Для связи:linux-75@narod.ru
 
Hosted by uCoz