Интерпретатор SHELL является оболочкой всей операционной системой и выполняет интерфейсные функции между пользователем и ОС. Он перехватывает и интерпретирует все команды пользователя, формирует и выводит ответные сообщения.
Помимо запуска на выполнение стандартных команд UNIX и исполняемых файлов, интерпретатор включает собственный язык, который по своим возможностям приближается к высокоуровневым языкам программирования. Этот язык позволяет создавать программы (shell-файлы, скрипты), которые могут включать операторы языка и команды UNIX. Такие файлы не требуют компиляции и выполняются в режиме интерпретации, но они должны обладать правом на исполнение (устанавливается с помощью команды chmod).
Общение пользователя с командным интерпретатором осуществляется вводом команд с клавиатуры после появления промпта (приглашения), обычно, символа '$'. Введенную последовательность символов интерпретатор будет рассматривать либо как имя внутренней команды, либо как имя исполняемого файла.
|
|
Процедуре (скрипту) shell могут быть переданы аргументы при запуске. Каждому из первых девяти аргументов ставится в соответствие позиционный параметр от $1 до $9 ($0 - имя самой процедуры), и по этим именам к ним можно обращаться из текста процедуры.
Прежде, чем начать рассмотрение некоторых операторов shell, следует обратить внимание на использование в командах некоторых символов.
\ знак отмены специального символа перевода строки, следующего непосредственно вслед за этим знаком.
‘’ одинарные кавычки: используются для обрамления текста: передаваемого как единый аргумент команды.
“” двойные кавычки, используются для обрамления текста, содержащего имена переменных для подстановки ($имя) или стандартные команды, заключенные в символы тупого ударения (`команда`).
`` символы тупого ударения, служат для выполнения команды, заключенной между ними.
Кроме того, для удобства работы с файлами почти все командные интерпретаторы интерпретируют символы '?' и '*', используя их как шаблоны имен файлов (т.н. метасимволы):
? – один любой символ;
* – произвольное количество любых символов.
Например: *.c – задает все файлы с расширением "c";
pr???.* – задает файлы, имена которых начинаются с "pr", содержат пять символов и имеют любое расширение.
Рассмотрим в качестве примера использование утилиты echo, которая только и умеет, что выводить в стандартный выходной поток переданные ей аргументы. Вывод на экран содержимого текущего каталога можно осуществить так:
echo “Текущий каталог: \
`pwd` \
`ls`”
А если ввести команду
echo *.?
то будут выведены все файлы с расширением из одного символа.
|
|
Переменные языка shell
Язык shell позволяет работать с переменными (без предварительного объявления). Имена переменных начинаются с буквы и могут включать буквы и цифры. Обращение к переменным начинается со знака '$'.
Пример. Переход к начальному каталогу пользователя:
cd $HOME
Оператор присваивания. Присвоение значений переменным осуществляется с помощью оператора ‘=’ без пробелов.
Пример: s=Hello
echo $s
Вычисление выражений осуществляется с помощью команды expr и арифметических и логических операторов:
арифметические | логические | ||
+ | сложение | = | равно |
- | вычитание | !- | не равно |
\* | умножение | \< | меньше |
/ | деление | \<= | меньше или равно |
% | остаток от деления | \> | больше |
\>= | больше или равно |
Результат операций сравнения - вывод 1 (true) или 0 (false). Все операторы и имена переменных должны отделяться друг от друга пробелами.
Пример.
a=5 b=12
a=’expr $a + 4’
d=’expr $b - $a’
echo $a $b $d
Будет выведено:
9 12 3
Условные выражения. Ветвление вычислительного процесса осуществляется с помощью оператора if:
if список_команд1
then список_команд2
[else список_команд3 ]
fi
Список_команд - это одна или несколько команд (для задания пустого списка используется двоеточие - ‘:’). Список_команд1 предает оператору if код возврата последней команды из списка. Если он равен 0, то выполняются команды из списка_команд2, таким образом нулевой код возврата эквивалентен значению “истина”. В противном случае выполняются команды из списка_команд3, если он существует.
Проверка условия может осуществляется с помощью команды test. Аргументами этой команды могут быть имена файлов, числовые и нечисловые строки. Она используется в следующих режимах:
Проверка файлов: test -ключ имя_файла
Ключи: -r файл существует и доступен для чтения;
-w файл существует и доступен для записи;
-x файл существует и доступен для исполнения;
-f файл существует и имеет тип ‘-‘, т.е. это обычный файл;
-s файл существует, имеет тип ‘-‘ и не пуст;
-d файл существует и имеет тип ‘d‘, т.е. это каталог.
Сравнение чисел: test число1 -ключ число2
Ключи: -eq равно;
-ne не равно;
-lt меньше;
-le меньше или равно;
-gt больше
-ge больше или равно.
Сравнение строк:
test [-n] строка строка непуста;
test -z строка строка пуста;
test строка1 = строка2 строки равны;
test строка1!= строка2 строки не равны.
Построение циклов. В языке shell есть три типа циклов: while, until и for.
цикл while:
while список_команд1{;|перевод строки}
do список_команд2{;|перевод строки}
done
В условии учитывается код возврата последней выполненной команды из списка_команд1, при этом 0 интерпретируется как “истина”.
цикл until:
until список_команд1{;|перевод строки}
do список_команд2{;|перевод строки}
done
Проверка условия выполняется перед выполнением цикла. Учитывается код возврата последней выполненной команды из списка_команд1, при этом цикл выполняется до тех пор, пока код возврата не примет значение “истина”.
цикл for:
for переменная [in список_значений]{;|перевод строки}
do список_команд{;|перевод строки}
done
Переменной присваивается значение очередного слова из списка_значений и для этого значения выполняется список_команд. Количество итераций равно количеству цепочек символов в списке_значений, разделенных пробелами. Если слово in и список_значений опущены как необязательные, то переменной поочередно присваиваются значения параметров, переданных при запуске данной программы. В качестве списка можно использовать шаблоны имен файлов, тогда интерпретатор превращает этот шаблон в требуемый синтаксисом список имен файлов, удовлетворяющий шаблону.
Пример. Печать списка имен текстовых файлов из текущего каталога.
list=`ls *.txt`
for val in $list
do
echo "$val"
done