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

Использование кавычек

   Имеется несколько символов, которые имеют в Shell специальное значение. Это  <, >, *, ?, [ и ]. Чтобы отменить специальное значение этих символов, требуется заключать их особым образом в одинарные (')  или двойные (") кавычки.  То же действие в отношении одиночного символа  выполняет обратная наклонная черта (\).  (Обратные одинарные кавычки (`)  используются только  для  командной подстановки в Shell и не отменяют специальных значений символов.)    Все символы, заключенные в одинарные кавычки, воспринимаются как обычные текстовые символы. Например, строка:

echostuff='echo $? $*; ls *| wc'

только присваивает переменной echostuff значение

echo $? $*; ls *| wc

но не вызывает выполнение ни одной из команд.    Внутри двойных кавычек специальное значение сохраняется только у некоторых символов - это$, \, ` и ". В результате внутри двойных кавычек имеет место подстановка значений переменных и команд. Однако, сами по себе двойные кавычки никак не влияют на подставляемые команды, и поэтому такие символы, как *, сохраняют свое специальное значение.    Чтобы отменить специальное значение символа $ и одинарных и двойных кавычек внутри двойных кавычек, перед ними требуется до полнительно указывать символ \. Вне двойных кавычек указание символа \ перед специальным символом адекватно заключению этого специального символа в одинарные кавычки. Символ \, стоящий перед символом новой строки, обозначает игнорирование этого символа. Благодаря этому можно продлевать командную строку.    Ниже приводятся несколько примеров использования кавычек:

Ввод

Интерпретация

'`'

обратная кавычка

'"'

двойная  кавычка

'`echo one`'

одно слово '`echo one`

'\"'

двойная кавычка

'`echo one`'

слово one

'`'

cинтаксическая ошибка

one two

два слова one и two

'one two'

одно слово 'one two'

'one two'

одно слово 'one two'

'one * two'

одно слово 'one * two'

'one * two'

одно слово 'one * two'

`echo one`

одно слово 'one'

9.Среда окружения в UNIX,управление средой через переменные

Окружение

Как уже говорилось, многие абстракции языка программирования доработаны в shell так, чтобы служить средством связывания и взаимодействия процессов с системой и друг с другом. Например, абстракция переменная превращается в понятие переменная окружения (environment variable).

Переменная окружения

С одной стороны, переменная окружения - обыкновенная строковая переменная, в которой кто угодно может хранить какие угодно значения; ее даже и описывать не надо:

$ One=U; Three=Zzz

$ echo Example 1: $One $Two $Three

Example 1: U Zzz

$ echo "Example 2: $One $Two $Three"

Example 2: U Zzz

$ echo 'Example 3: $One $Two $Three'

Example 3: $One $Two $Three

Из первого примера видно, что сам факт присваивания объявляет переменную, а содержимое необъявленной переменной просто считается пустым (напомним, что команда echo выводит все параметры командной строки, разделяя их пробелом). Как показывают второй и третий примеры, подстановка значения переменной (операция $имя_переменной ) продолжает работать, если текст заключен в двойные кавычки, и не работает, если используются одинарные. По договоренности (см. главу 7) закавыченный текст передается как один параметр командной строки. Теперь очевидно, что подстановку shell делает до вызова команды; только этим можно объяснить, почему в первом примере echo выводит один пробел между U и Zzz: она получаетчетыре параметра ( Example 1: U и Zzz ), разделенные цепочками пробелов.

Несмотря на то что переменные в shell - строкового типа, легко организовать арифметические операции над ними: если содержимое переменной нельзя интерпретировать как число, арифметическая операция завершается с ошибкой. Арифметика встроена почти во все виды командных интерпретаторов (см. "Сравнительную таблицу командных интерпретаторов"), однако, к сожалению, в каждом это сделано слегка по-своему. Наиболее распространена арифметическая подстановка (arithmetic expansion), при которой shellвычисляет строки вида $((арифметическое выражение)). Есть надежда, что арифметическая подстановка с целыми числами в версии современного BSD- sh или Linux- ash будет работать и в остальных командных интерпретаторах гнезда Bourne:

$ A=7; b=3; echo $(($A*$b))

21

В примере, описывающем понятие сценария, мы видели, как в shell устроен механизм передачи параметров командной строки. Все просто: первый параметр попадает внутри сценария в переменную с именем 1 ( подстановка значения этой переменной выглядит как $1 ), второй - в переменную с именем 2 и т. д., пока есть параметры в командной строке. Имя самого сценария передается в переменной 0 в точности так, как мы его вызвали. Количество переданных параметров подставится вместо $# (напомним, что по американской традиции этот символ используется вместо нашего No). Все параметры командной строки подставляются вместо $*или $@ (Какая между этими формами разница? RTFM!)

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