Командный интерпритатор, скрипты, спецсимволы, команды...
Поводом для написания данного документа стала необходимость
разобраться в том как написать скрипт запуска(см. 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/