Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен UNIX.docx
Скачиваний:
25
Добавлен:
11.06.2015
Размер:
532.39 Кб
Скачать

Переменные Shell

   В Shell имеется несколько способов создания переменных. Переменная - это имя, которому присвоено текстовое значение. Некоторые переменные являются позиционными параметрами - их  значения устанавливаются только в командной строке. Остальные переменные - это просто имена, которым пользователь или сам интерпретатор присвоил текстовые значения.

Позиционные параметры

   Когда вызывается  процедура  Shell,   то  Shell  сразу неявно создает позиционные параметры.  Имя самой процедуры Shell в нулевой позиции   в командной строке присваивается позиционному параметру $0.  Первый аргумент команды называется $1 и т.д. Чтобы получить доступ  к аргументам в позициях с номером больше 9,  можно использовать команду shift.  Например,  следующую процедуру можно использовать для просмотра позиционных параметров и затем обрабатывать все необходимые файлы:

while test -n "$1"

do case $1 in

-a) A=aoption ; shift;;

-b) B=boption ; shift;;

-c) C=coption ; shift;;

-*) echo "bad option" ; exit 1 ;;

*) process rest of files

esac

done

   Пользователь может явно передать  необходимые  значения  этим позиционным параметрам с помощью команды set. Например, команда:

set abc def ghi

присваивает значение  "abc"  первому  позиционному  параметру $1, значение "def" - второму $2 и "ghi" - третьему $3.  Нулевой позиционный параметр  $0  нельзя  переопределить  таким способом - он всегда относится к имени процедуры Shell.    Переменные, определяемые пользователем    Интерпретатор Shell  также распознает буквенно-цифровые переменные, которым  присвоены текстовые значения.   Простая  команда присвоения имеет синтаксис:

имя=строка

   После присвоения  при указании $имя будет выдаваться значение строки. Имя переменной - это последовательность букв, цифр и знаков подчеркивания,    обязательно  начинающееся с буквы или знака подчеркивания. Пробелы вокруг знака равенства (=) в команде присваивания недопустимы.  Позиционные параметры таким способом определить нельзя; они могут устанавливаться только командой set.    В команде  присвоения может быть более одного присвоения,  но помните, что Shellприсваивает значения переменным справа налево. Так, в результате выполнения следующей командной строки:

A=$B B=abc

переменной А будет присвоено значение "abc".    Ниже приводятся примеры простых присвоений. Двойные кавычки с правой стороны   команды  присвоения позволяют указывать пробелы, знаки табуляции, символы перехода на новую строку и точки с запятой в  присваиваемом тексте,  а также выполнять подстановку переменных. Это  значит, что при обнаружении позиционных параметров и других имен  переменных,  перед которыми стоит знак $,  они будут заменяться на соответствующие значения, если они имеются. Одинарные кавычки подавляют подстановку переменных:

MAIL=/usr/mail/gas

echovar="echo $1 $2 $3 $4"

stars=*****

asterisks='$stars'

   В приведенных примерах переменной echovar присвоено  значение строки, состоящей из слова echo и четырех позиционных параметров, разделенных пробелами. Вокруг последовательности звездочек, присваиваемых переменной stars,  кавычек не требуется, т.к. их специальное значение здесь не действует.  Обратите внимание, что переменной asterisks  присвоено  текстовое  значение  "$stars",  а не "*****", т.к. одинарные кавычки отменили подстановку.    В командах присвоения при подстановке пробелы повторно не интерпретируются, поэтому  переменные $first и $second в  следующем примере имеют одно и то же значение:

first='a string with embedded spaces'

second=$first

   При обращении к значениям переменных вы можете заключать  имя переменной в   фигурные скобки,  чтобы отделить имя переменной от остального текста. В частности, если символ, непосредственно следующий после имени,  является буквой, цифрой или знаком подчеркивания, то фигурные скобки необходимы. В качестве примера рассмотрим:

a='This is a string'

echo "${a}ent test of variables."

   В данном случае команда echo напечатает:

This is a stringent test of variables.

   Если бы  вы  не  использовали  фигурные  скобки,   то   Shell подставил бы пустое значение вместо "$aent" и напечатал:

test of variables.

   Интерпретатором Shell  поддерживаются  следующие  переменные. Некоторые из них определяются и устанавливаются самим интерпретатором, но все они могут быть изменены пользователем. HOME  Программа login  присваивает этой  переменной  значение каталога загрузки пользователя,  т.е. каталога, который является текущим во время выполнения login; команда cd, казанная без аргументов,  переключает в каталог с именем $HOME.  Использование этой переменной позволяет  не следить за полными именами процедур Shell. IFS  Эта переменная определяет, какие символы являются внутренними разделителями полей. Это символы, которые Shell использует при интерпретации пробелов.  (Если вы хотите использовать какой-либо разделитель,  вы должны установить его в переменной IFS.) Интерпретатор Shell при запуске включает  в IFS символ пробела,  знак табуляции и символ новой строки. MAIL  Эта переменная  содержит  полное имя (с путями,  где он расположен) файла, куда приходит почта. Если переменная MAIL установлена,  то Shell проверяет, было ли что-нибудь добавлено в указанный файл и дает сообщение о  появлении новой  почты  при  каждом возврате на командный уровень (например, при выходе из редактора). Переменная MAIL автоматически  не устанавливается; если требуется, ее необходимо  установить  в   пользовательском   файле .profile. Команда  export и файл .profile рассматриваются ниже.)  (О наличии почты в стандартном файле почты сообщается при загрузке независимо от значения переменной MAIL.) MAILCHECK Этот  параметр определяет с какой частотой (в секундах) Shell будет проверять появление почты в файлах, указанных в параметрах MAILPATH и MAIL.  Принимаемое по умолчанию значение равно 600 секунд. Если этот параметр установлен равным  0,   то  Shell будет проверять наличие почты при каждом появлении символа приглашения. MAILPATH  Этот параметр содержит список имен файлов,  разделенных двоеточием. Если этот параметр установлен, то Shell информирует пользователя  о приходе почты в любой из указанных файлов.  После каждого имени файла может  стоять знак %  и  сообщение,  которое будет выводиться,  когда произойдет изменение времени модификации  этого  файла. По умолчанию выдается сообщение "You have mail". SHACCT  Если в этот параметр  занесено  имя  файла,  доступного пользователю для записи,  Shell будет делать в него соответствующие записи для каждой  выполняемой  процедуры Shell. Для анализа этих данных могут использоваться такие процедуры, как acctcom (ADM) и accton (ADM). SHELL  Когда вызывается интерпретатор Shell, он ищет эту переменную и если она имеется и в ее значении вместо  имени файла указан символ 'r',  то Shell загружается в укороченном виде. PATH  Эта переменная определяет пути, которые использует Shell при поиске команд.  Ее значение представляет собой список имен  каталогов,   разделенный  двоеточиями.  Shellприсваивает переменной PATH значение  :/bin:/usr/bin, где перед  первым двоеточием ничего не указано.  Пустой аргумент в любом месте в списке путей всегда обозначает текущий каталог.   В некоторых системах поиск в текущем каталоге по умолчанию отсутствует, и поэтому переменная PATH определяется  как  /bin:/usr/bin.  Если вы хотите, чтобы текущий каталог при поиске команд  просматривался последним, а не первым, используйте:

PATH=/bin:/usr/bin:

В следующем примере два двоеточия,  стоящие подряд, интерпретируются как двоеточие, за которым следует пустой аргумент и двоеточие, тем самым обозначая текущий каталог. Вы  можете  создать  личный  каталог   с командами (например, $HOME/bin[color]) и задать просмотр его в первую очередь:

PATH=$HOME/bin::/bin:/usr/bin

Параметр PATH обычно устанавливается в файле [color=gray].profile. CDPATH  Эта переменная определяет пути поиска каталогов, содержащих arg.  Альтернативные имена каталогов  разделяются двоеточиями. Путь,  используемый по умолчанию, - <null> (он определяет текущий каталог).  Текущий каталог определяется нулевым  именем пути,  который можно указывать сразу после знака равенства или между двумя двоеточиями в любом  месте списка.  Если arg начинается с /, тогда поиск по путям не выполняется. В противном случае просматриваются все указанные в путях каталоги. PS1  Эта переменная определяет,  какое выражение следует использовать в  качестве  первичного приглашения системы. Если Shell является интерактивным, то он выдает приглашение в  виде PS1,  когда ожидается ввод.  По умолчанию PS1 присвоено значение "$ ". PS2  Эта переменная определяет выражение для вторичного приглашения системы.  Если интерпретатору Shell  требуется входных данных больше, чем было указано в строке, то он  выдает приглашение в виде PS2. По умолчанию PS2 присвоено значение  ">  " (знак "больше",  за которым следует пробел).    В большинстве случаев вам необходимо передавать все указанные переменные во все интерпретаторы,  которые вы  используете.   Для этого используйте  команду export в вашем файле .profile, например:

export HOME IFS MAIL PATH PS1 PS2

Заранее определяемые специальные переменные        У некоторых переменных есть специальное значение и оно  устанавливается только самим интерпретатором. Это: $#  Записывает количество аргументов,  переданных в Shell, несчитая имени самой вызываемой процедуры.  Например, при выполнении команды:

sh cmd a b c

в $# передается номер последнего позиционного параметра и поэтому $# равно 3.  Эту переменную  можно  использовать, например, для  проверки наличия всех необходимых аргументов:

if test $# -lt 2

then

echo 'two or more args required'; exit

fi

$? - Эта переменная содержит код завершения последней   выполненной команды.  Ее значение это десятичное число.  Большинство команд  UNIX дают код возврата 0 при успешном завершении. Сам Shell возвращает  текущее  значение  $? в качестве своего кода завершения. $$  В этой переменной хранится номер текущего процесса.  Поскольку номера процессов среди всех выполняемых никогда не могут совпадать,  эту переменную часто используют для образования имен временных файлов. В UNIX нет механизма автоматической генерации и удаления временных файлов.  Файл существует до  тех  пор,   пока его не сотрут специально. Пользоваться временными файлами как правило  бывает  неудобно - механизм программных каналов UNIX для большинства приложений намного лучше.  Однако, потребность во временных файлах  с уникальными именами иногда все же появляется.    Следующий пример  демонстрирует рекомендуемый способ создания временных файлов.  Обратите внимание  на  то, что  каталоги /bin  и /usr/tmp очищаются в случае перезагрузки системы.

# применение идентификатора текущего

# процесса для формирования уникального

# временного файла

temp=/usr/tmp/$$

ls > $temp

# здесь стоят команды, некоторые из которых

# используют временные файлы

rm -f $temp

# стирание в конце работы

$!  Номер последнего процесса,  который выполнялся  в фоновом режиме. Это число, содержащее от 1 до 5 цифр. $-  Это переменная, состоящая из имен флагов, включенных в данный момент в Shell. Состояние Shell    -------------------------------------------------------------        Состояние Shell в каждый момент времени определяется значениями позиционных параметров,  переменных, определенных пользователем, переменными  операционной системы,  режимом работы и текущим рабочим каталогом.    Состояние Shell может быть изменено различными способами. Они включают в себя смену текущего каталога с помощью команды cd, установку флагов и чтение команд из  специального  файла  .profile, находящегося в вашем загрузочном каталоге. Смена каталогов    Команда cd  меняет каталог на тот,  который указан в качестве аргумента. Ее можно и нужно использовать для перехода в требуемое место в структуре каталогов.  Обратите внимание, что cd часто помещают внутри скобок, чтобы приказать подоболочке сменить каталог и выполнить какие-либо команды,  не затрагивая основную оболочку.    Например, первая из приводимых ниже команд копирует файл /etc/passwd в /usr/you/passwd, а вторая сначала меняет каталог на /etc и затем копирует файл:

cp /etc/passwd /usr/you/passwd

(cd /etc; cp passwd /usr/you/passwd)

   Обратите внимание на скобки.  Обе строки имеют одинаковый эффект.    Если интерпретатор считывает команды с терминала и указанного каталога не существует (или доступ запрещен),  то проводится  попытка коррекции каждого компонента имени каталога в поисках "правильного" имени. После этого Shell спрашивает разрешения на переход в каталог с исправленным именем: ответ "n" означает запрет, а любой другой символ разрешает. Файл .profile    Файл с именем .profile считывается каждый раз,  когда вы загружаетесь в UNIX. Он обычно используется для выполнения специальных команд   и для установки и передачи переменных во все подоболочки. Только после того, как все команды из файла .profile будут считаны и выполнены,  Shell начнет считывание команд из стандартного ввода - обычно с терминала.    Если вы хотите произвести переустановку параметров среды после внесения изменений в файл.profile, введите:

.profile

   С помощью этой команды можно избежать перерегистрации пользо- вателя в  системе,   обычно  используемой  для  исполнения  файла .profile. Флаги выполнения    Команда set позволяет вам изменять поведение Shell путем  установки определенных   флагов.  В частности,  флаги -x и -v могут быть полезны при вызове Shell как команды с терминала.  Эти флаги можно установить командой set:

set -xv

Те же самые флаги можно выключить командой:

set +xv

Эти два флага имеют следующее действие: -v  Вводимые  строки  печатаются  так,  как  они  считываются Shell'ом. Этот флаг удобен для устранения  синтаксических ошибок. Команды  на  каждой  введенной строке выполняются после того, как она будет напечатана. -х  Команды и их аргументы печатаются по мере  их выполнения. (Команды управления Shell, такие как for, while и т.д. не печатаются.) Обратите внимание,  что -х вызывает  трассировку только тех команд,  которые выполняются, а -v печатает всю командную строку,  пока не встретится  синтаксическая ошибка.    Команда set также  используется  для установки этих и других флагов в процедурах Shell. Среда выполнения команд    -------------------------------------------------------------    Все переменные и их значения,  которые известны команде перед выполнением, образуют ее оболочку (среду выполнения). Эта оболочка включает в себя переменные,  которые команда получает "по наследству" от родительского процесса,  и переменные,  указанные как ключевые параметры в командной строке, которая запускает команду.    Переменные, которые Shell передает дочернему процессу  -  это переменные, перечисленные как аргументы в команде export. Эта команда помещает указанные переменные в оболочки как самого  Shell, так и всех его будущих дочерних процессов.    Ключевые параметры - это пары  переменная-значение,   которые появляются в   форме присвоений,  обычно перед именем процедуры в командной строке. Такие переменные помещаются в оболочку вызываемой процедуры. Например:

# keycommand

echo $a $b

   Это пример простой процедуры,  которая выводит значения  двухпеременных. Если ее вызвать следующим образом:

a=key1 b=key2 keycommand

то результирующий вывод будет:

key1 key2

   Ключевые параметры не являются аргументами и не изменяют $#.    Процедура имеет доступ к значению любой  переменной  в  своей оболочке. Однако,  даже если значение переменной было изменено, эти изменения не отражаются на параметрах  Shell;  они  относятся только к конкретной процедуре. Для того, чтобы эти изменения были переданы в дочерние процессы данной  процедуры, эти переменные должны быть перечислены в команде export в этой процедуре.  Чтобы получить список переменных, которые являются передаваемыми из текущего интерпретатора Shell, введите:

export

   Вы также получите список переменных, которые  можно  только считывать. Чтобы  получить список пар имя-значение в текущей оболочке, введите:

printenv

или

env

Вызов интерпретатора Shell    -------------------------------------------------------------    Shell -  это команда и она может быть вызвана также как и любая другая команда: sh proc [arg...]      Новая копия Shell вызывается для чтения proc. sh -v proc [arg...]   Это эквивалентно помещению "set -v" в начале proc. Также можно указывать флаги -x, -e, -u, -n. proc [arg...]         Если proc  является выполняемым файлом, а не скомпилированной  программой, то эффект будет такой же, как от команды:

sh proc args

Преимущество такой  формы записи заключается в том,  что переменные,  которые были экспортированы  в оболочку,  будут передаваться и в процессы,  запускаемые из proc.  Таким образом,  любые изменения, произведенные в отношении  передаваемых переменных  внутри  proc,  будут распространяться на последующие  команды, вызываемые из proc. Передача параметров в процедуры Shell    -------------------------------------------------------------    Когда просматривается командная строка,  любая последовательность символов в виде $n заменяется на n-ный аргумент Shell, считая имя процедуры как $0.  Такое соглашение позволяет производить прямое обращение к имени процедуры и к позиционным параметрам (не более 9).  Дополнительные аргументы можно обрабатывать, пользуясь командой shift или используя циклfor.    Команда shift сдвигает аргументы влево,  т.е. значение $1 теряется, $2  заменяет $1,  $3 заменяет $2 и т.д. Позиционный параметр с наибольшим номером становится неопределенным  ($0  никогда не сдвигается). Например, в приводимой ниже процедуре ripple, команда echo записывает свои аргументы в стандартный вывод:

# команда ripple

while test $# != 0

do

echo $1 $2 $3 $4 $5 $6 $7 $8 $9

shift

done

   Строки, начинающиеся с #, являются комментариями. Команда цикла while рассматривается в пункте "Условные циклы: while и until" в этой главе.  Если эта процедура будет вызвана таким способом:

ripple a b c

то она напечатает:

---------------------------------------------------------

¦ a b c

¦ b c

¦ c

   Специальная переменная "звездочка" ($*) вызывает подстановку всех позиционных параметров, кроме $0. Так, строку с командой echo в последнем примере можно записать намного компактнее:

echo $*

   Эти две записи команды echo неэквивалентны полностью. Первая печатает максимум девять позиционных параметров, а вторая печатает все текущие позиционные параметры. Переменная ($*) более емкая и подвержена ошибкам в меньшей степени. Один из способов ее использования состоит в передаче команде произвольного числа аргументов. Например, команда:

wc $*

подсчитывает слова в каждом из  файлов, указанных в командной строке.    Важно понимать последовательность действий, выполняемых Shell'ом при просмотре командной строки и выполнении подстановок. Shell сначала считывает ввод до символа новой строки или точки с запятой и затем выполняет анализ считанной части ввода. Переменные заменяются своими значениями и затем делается командная подстановка (через обратные кавычки). Затем определяются, обрабатываются и удаляются из строки аргументы, переадресующие ввод-вывод. После этого  Shell просматривает получившуюся командную строку и ищет внутренние разделители полей, т.е. все символы, определенные в IFS и разделяющие командную строку на отдельные аргументы. Пустые аргументы (определенные в виде "" или '') сохраняются, а остальные пустые аргументы, полученные в результате оценки переменных, которые являются нулевыми или не определены, удаляются. Затем происходит формирование имен файлов по указанным шаблонам. И только после этого командная строка выполняется интерпретатором.    Иногда командные строки создаются внутри процедур Shell. В этом случае бывает полезно заставить Shell повторно просмотреть командную строку после выполнения подстановок. Для этих целей имеется специальная команда eval. Она считывает командную строку в качестве своего аргумента, выполняет все подстановки и печатает ее. Рассмотрим следующий пример:

command=who

output=' | wc -l'

eval $command $output

   Эта часть процедуры выведет на экран получившуюся строку:

who | wc -l

   Использование команды eval может быть вложенным, при этом командная строка просматривается несколько раз.

11.Файловая система в UNIX