Рефераты. Программирование на языке SHELL (OS UNIX) p>Конструкция "1>&2" - означает, что кроме номера стандартного файла, в который перенаправить, необходимо впереди ставить "&"; вся конструкция пишется без пробелов.
|- |закрывает стандартный вывод. |


2.4. Командные файлы.

Для того, чтобы текстовый файл можно было использовать как команду, существует несколько возможностей.
Пусть с помощью редактора создан файл с именем "cmd", содержащий одну строку следующего вида: date; pwd; ls
Можно вызвать shell как команду, обозначаемую "sh", и передать ей файл
"cmd", как аргумент или как перенаправленный вход, т.е.

$ sh cmd или

$ sh file_1 echo 'str_1 str_2' > file_2 cat file_1 file_2 даст выдаст последовательно одинаковые файлы file_1 и file_2: str_1 str_2 str_1 str_2
Заметим также, что бэк-слэш () не только экранирует следующий за ним символ, что позволяет использовать специальные символы просто как символы, представляющие сами себя (он может экранировать и сам себя - ), но в командном файле бэк-слэш позволяет об'единять строки в одну (экранировать конец строки).
Например, приводившийся ранее пример командной строки: cat file_1 | grep -h result | sort | cat -b > file_2 может быть записан в командном файле, скажем, как cat file_1 | grep -h result | sort | cat -b > file_2
Кстати, эффект продолжения командной строки обеспечивает и символ конвейера. В данном случае это может дать более симпатичный результат, например: cat file_1 | grep -h result | sort | cat -b > file_2


3.3. Манипуляции с shell-переменными

Несмотря на то, что shell-переменные в общем случае воспринимаются как строки, т. е. "35" - это не число, а строка из двух символов "3" и "5", в раде случаев они могут интерпретироваться иначе, например, как целые числа.

Разнообразные возможности имеет команда "expr".
Проиллюстрируем некоторые на примерах:
Выполнение командного файла: x=7 y=2 a=`expr $x + $y` ; echo a=$a a=`expr $a + 1` ; echo a=$a b=`expr $y - $x` ; echo b=$b c=`expr $x '*' $y` ; echo c=$c d=`expr $x / $y` ; echo d=$d e=`expr $x % $y` ; echo e=$e выдаст на экран a=9 a=10 b=-5 c=14 d=3 e=1

Операция умножения ("*") обязательно должна быть заэкранирована, поскольку в shell этот значок воспринимается, как спецсимвол, означающий, что на это место может быть подставлена любая последовательность символов.
С командой "expr" возможны не только (целочисленные) арифметические операции, но и строковые:

A=`expr 'cocktail' : 'cock'` ; echo $A

B=`expr 'cocktail' : 'tail'` ; echo $B

C=`expr 'cocktail' : 'cook'` ; echo $C

D=`expr 'cock' : 'cocktail'` ; echo $D
На экран будут выведены числа, показывающее число совпадающих символов в цепочках (от начала). Вторая из строк не может быть длиннее первой :

4

0

0

0

3.4. Экспорт переменных

В ОС UNIX существует понятие процесса. Процесс возникает тогда, когда запускается на выполнение какая-либо команда.
Например, при наборе на клавиатуре "р " порождается процесс "р". В свою очередь "р" может породить другие процессы. Допустим, что "р" вызывает
"р1" и "р2", которые последовательно порождают соответствующие процессы.
У каждого процесса есть своя среда - множество доступных ему переменных.
Например, до запуска "р" уже существовала среда, в которой уже были определены некоторые переменные. Запуск "р" порождает новую среду; уже в ней будут порождены "р1" и "р2".
Переменные локальны в рамках процесса, в котором они объявлены, т.е. где им присвоены значения. Для того, чтобы они были доступны и другим порождаемым процессам, надо передать их явным образом. Для этого используется встроенная команда "export".

3.5. Параметры

В командный файл могут быть переданы параметры. В shell используются позиционные параметры (т.е. существенна очередность их следования). В командном файле соответствующие параметрам переменные (аналогично shell- переменным) начинаются с символа "$", а далее следует одна из цифр от 0 до
9:
Пусть "examp-1" вызывается с параметрами "cock" и "tail". Эти параметры попадают в новую среду под стандартными именами "1" и "2". В (стандартной) переменной с именем "0" будет храниться имя вызванного расчета.
При обращении к параметрам перед цифрой ставится символ доллара "$" (как и при обращении к переменным):
|$0 |соответствует имени данного командного файла; |
|$1 |первый по порядку параметр; |
|$2 |второй параметр и т.д. |


Поскольку число переменных, в которые могут передаваться параметры, ограничено одной цифрой, т.е. 9-ю ("0", как уже отмечалось имеет особый смысл), то для передачи большего числа параметров используется специальная команда "shift".
Своеобразный подход к параметрам дает команда "set".
Например, фрагмент set a b с echo первый=$1 второй=$2 третий=$3 выдаст на экран первый=a второй=b третий=c т.е. команда "set" устанавливает значения параметров. Это бывает очень удобно. Например, команда "date" выдает на экран текущую дату, скажем, "Mon
May 01 12:15:10 2000", состоящую из пяти слов, тогда set `date` echo $1 $3 $5 выдаст на экран

Mon 01 2000
Команда "set" позволяет также осуществлять контроль выполнения программы, например:
|set -v |на терминал выводятся строки, читаемые shell. |
|set +v |отменяет предыдущий режим. |
|set -x |на терминал выводятся команды перед выполнением. |
|set +x |отменяет предыдущий режим. |


Команда "set" без параметров выводит на терминал состояние программной среды.

3.6. Подстановки shell-интерпретатора

Перед началом непосредственной интерпретации и выполнением команд, содержащихся в командных файлах, shell выполняет различные виды подстановок:

1. ПОДСТАНОВКА РЕЗУЛЬТАТОВ. Выполняются все команды, заключенные в обратные кавычки, и на их место подставляется результат.

2. ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на "$", заменяются соответствующими значениями переменных и параметров.

3. ИНТЕРПРЕТАЦИЯ ПРОБЕЛОВ. Заэкранированные пробелы игнорируются.

4. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ. Проверяются слова на наличие в них спецсимволов

("*", "?","[]") и выполняются соответствующие генерации.

3.7. Программная среда

Каждый процесс имеет среду, в которой он выполняется. Shell использует ряд переменных этой среды.
Если вы наберете команду "set" без параметров, то на экран будет выдана информация о ряде стандартных переменных, созданных при входе в систему (и передаваемых далее всем вашим новым процессам "по наследству"), а также переменных, созданных и экспортируемых вашими процессами.
Конкретный вид и содержание выдаваемой информации в немалой степени зависит от того, какая версия UNIX используется и как инсталлирована система.


Результат выполнения команды set без параметров (не полный):

HOME=/root

PATH=/usr/local/bin:/usr/bin:/bin:.:/usr/bin/X11:

IFS=

LOGNAME=sae

MAIL=/var/spool/mail/sae

PWD=/home/sae/STUDY/SHELL

PS1=${PWD}:" "

PS2=>

SHELL=/bin/bash
Прокомментируем значения переменных.
HOME=/root - это имя домашнего директория, в котором пользователь оказывается после входа в систему. То есть, правильно набрав имя и пароль, я окажусь в директории "/root".
PATH=/bin:/usr/bin:.:/usr/local/bin:/usr/bin/X11 - эта переменная задает последовательность файлов, которые просматривает "shell" в поисках команды.
Имена файлов разделяются здесь двоеточиями. Последовательность просмотра соответствует очередности следования имен в тропе. Но первоначально поиск происходит среди так называемых встроенных команд. В число встроенных команд входят наиболее часто используемые команды, например "echo", "cd",
"pwd", "date". После этого система просматривает директорий "/bin", в котором могут находиться команды "sh", "cp", "mv", "ls" и т.п. Затем директорий "/usr/bin" с командами "cat", "сс", "expr", "nroff", "man" и многими другими. Далее поиск происходит в текущем директории (".", или другое обозначение "пусто", т.е.""), где скорее всего находятся написанные вами команды.
После набора командной строки и нажатия "shell" (после выполнения необходимых подстановок) распознает имя, соответствующее команде и осуществляет ее поиск в директориях, перечисленных в PATH. Если команда размещена вне этих директориев, она не будет найдена. Если присутствует несколько команд с одинаковым именем, то вызвана будет та, которая расположена в директории, просматриваемом первым.
PATH, как и прочие переменные, можно легко менять, добавляя, переставляя или исключая директории.
IFS= (Внутренний Разделитель Полей) перечисляет символы, которые служат для разделения слов (полей). Таковыми являются "пробел", "табуляция" и "перевод строки", поэтому здесь слева от присваивания ничего не видно и занято две строки.
LOGNAME=root - имя входа ("имя" пользователя).
MAIL=/var/spool/mail/root - имя файла, в который поступает (электронная) почта.
PWD=/root - имя текущего директория
PS1=${PWD}:" " - вид промтера. В данном случае в промптере будет выдаваться имя текущего директория двоеточие и пробел. То есть здесь будет "/root: ".
PS2=> - этот промтер (здесь ">") используется как приглашение к продолжению ввода (в очередной строке) незаконченной команды. Например, наберите открывающую скобку "(" и после нажатия в следующей строке вы увидите этот промптер. Если пока не знаете, что дальше делать, наберите закрывающую скобку ")" и он исчезнет.
SHELL=/bin/sh - эта переменная указывает оболочку, которую использует пользователь. В данном случае используется стандартный shell ("sh").
Исходная среда устанавливается автоматически при входе в систему с использованием файлов типа "/etc/rc" и "/etc/.profile".
Один из способов просто изменит среду (например, тропу поиска команд, вид промтера, вид оболочки, цвет экрана и т.п.) можно, разместив эту информацию в своем домашнем директории в специализированном файле ".profile"
(${HOME}/.profile), присвоив нужные значения переменным среды. То есть вызвать это файл в редактор и написать, что пожелаете). Тогда при каждом вашем входе в систему этот файл будет автоматически выполняться и устанавливать новую среду. Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем
ДОМАШНЕМ директории (директории входа).
Следует иметь в виду, что имена файлов, начинающиеся с точки, вообще имеют особый статус. Так, они не выдаются на экран простой командой "ls" - необходимо вызывать эту команду с флагом "-a". Кстати, и не уничтожаются огульно командой "rm *".
Сам интерпретатор shell автоматически присваивает значения следующим переменным (параметрам):
|? |значение, возвращенное последней командой; |
|$ |номер процесса; |
|! |номер фонового процесса; |
|# |число позиционных параметров, передаваемых в shell; |
|* |перечень параметров, как одна строка; |
|@ |перечень параметров, как совокупность слов; |
|- |флаги, передаваемые в shell. |

Страницы: 1, 2, 3



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.