Смекни!
smekni.com

Программирование на Shell (стр. 3 из 5)

Например, приводившийся ранее пример командной строки:

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 существует понятие процесса. Процесс возникает тогда, когда

запускается на выполнение какая-либо команда.

Например, при наборе на клавиатуре "р <Enter>" порождается процесс "р". В свою

очередь "р" может породить другие процессы. Допустим, что "р" вызывает "р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="Times New Roman">" без параметров выводит на терминал состояние

программной среды.

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

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

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

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

кавычки, и на их место подставляется результат.

ПОДСТАНОВКА ЗНАЧЕНИЙ ПАРАМЕТРОВ И ПЕРЕМЕННЫХ. То есть слова, начинающиеся на

"$", заменяются соответствующими значениями переменных и параметров.

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

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

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

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" и многими другими. Далее поиск

происходит в текущем директории (".", или другое обозначение "пусто", т.е.""),

где скорее всего находятся написанные вами команды.

После набора командной строки и нажатия <Enter> "shell" (после выполнения

необходимых подстановок) распознает имя, соответствующее команде и осуществляет

ее поиск в директориях, перечисленных в PATH. Если команда размещена вне этих

директориев, она не будет найдена. Если присутствует несколько команд с

одинаковым именем, то вызвана будет та, которая расположена в директории,

просматриваемом первым.

PATH, как и прочие переменные, можно легко менять, добавляя, переставляя или

исключая директории.

IFS= (Внутренний Разделитель Полей) перечисляет символы, которые служат для

разделения слов (полей). Таковыми являются "пробел", "табуляция" и "перевод

строки", поэтому здесь слева от присваивания ничего не видно и занято две

строки.

LOGNAME=root - имя входа ("имя" пользователя).

MAIL=/var/spool/mail/root - имя файла, в который поступает (электронная) почта.

PWD=/root - имя текущего директория

PS1=${PWD}:" " - вид промтера. В данном случае в промптере будет выдаваться имя

текущего директория двоеточие и пробел. То есть здесь будет "/root: ".

PS2=> - этот промтер (здесь ">") используется как приглашение к продолжению

ввода (в очередной строке) незаконченной команды. Например, наберите открывающую

скобку "(" и после нажатия <Enter> в следующей строке вы увидите этот промптер.

Если пока не знаете, что дальше делать, наберите закрывающую скобку ")" и он

исчезнет.

SHELL=/bin/sh - эта переменная указывает оболочку, которую использует

пользователь. В данном случае используется стандартный shell ("sh").

Исходная среда устанавливается автоматически при входе в систему с

использованием файлов типа "/etc/rc" и "/etc/.profile".

Один из способов просто изменит среду (например, тропу поиска команд, вид

промтера, вид оболочки, цвет экрана и т.п.) можно, разместив эту информацию в

своем домашнем директории в специализированном файле ".profile"

(${HOME}/.profile), присвоив нужные значения переменным среды. То есть вызвать

это файл в редактор и написать, что пожелаете). Тогда при каждом вашем входе в

систему этот файл будет автоматически выполняться и устанавливать новую среду.

Этот файл должен ОБЯЗАТЕЛЬНО размещаться в вашем ДОМАШНЕМ директории (директории

входа).

Следует иметь в виду, что имена файлов, начинающиеся с точки, вообще имеют

особый статус. Так, они не выдаются на экран простой командой "ls" - необходимо

вызывать эту команду с флагом "-a". Кстати, и не уничтожаются огульно командой

"rm *".

Сам интерпретатор shell автоматически присваивает значения следующим переменным

(параметрам):

?значение, возвращенное последней командой;

$номер процесса;

!номер фонового процесса;

#число позиционных параметров, передаваемых в shell;