Раздел 6

КОМАНДНЫЙ ЯЗЫК SHELL

Обзор

Вы взаимодействуете с ОС UNIX с помощью языка shell. Программа shell переводит вводимые Вами команды в формат, который более понятен ОС UNIX.

Одновременно shell является также интерпретирующим языком программирования. Процедура или программа на языке shell - это файл, содержащий команды и операторы. Можно создать собственную процедуру shell и выполнить ее тем же способом, как и стандартную команду ОС UNIX.

В этом разделе представлены основные понятия, необходимые для разработки и выполнения процедур shell.

ЦЕЛИ

    1. Создавать простую процедуру shell.
    2. Помещать в нее пустые строки и комментарии.
    3. Выполнять эту процедуру.
    4. Определить термин процесс
    .
    5. Определить отношение между процессом-предком и процессом-потомком.
    6. Описать переменные, которые создаются shell автоматически.
    7. Выполнять команду
    set для вывода имен и значений всех переменных в Вашем входном shell.
    8. Выполнять команду
    env для вывода значений переменных среды.
    9. Использовать команду
    export, чтобы разрешить нескольким процессам shell одновременно использовать имена и значения переменных.
    10. Использовать оператор
    echo для вывода значений отдельных переменных.
    11. Определить типы переменных, допустимые в shell.
    12. Определить имена переменных, допустимые в shell.
    13. Использовать оператор присваивания и оператор
    read для присвоения переменным значений.
    14. Использовать подстановку команд для присвоения значения переменной.
    15. Использовать символы, завершающие значение переменной shell в операторе присваивания.
    16. Защищать оператор присваивания значения переменной от действий специальных символов (метасимволов).
    17. Соединять значения переменных.
    18. Использовать позиционные параметры.
    19. Использовать специальную переменную параметров
    $*.
    20. Определить процессы, выполняемые программой входа login.
    21. Описывать и создавать файл .profile.
    22. Выполнять файл .profile с помощью команды "точка" (dot).
    23. Устанавливать режимы терминала с помощью команды
    stty.
    24. Назначать Вашу клавишу стирания для исправления одного символа.
    25. Перечислить метасимволы, имеющие специальное значение в shell.
    26. Использовать символ обратной косой черты (backslash) для буквализации (отмены специального значения) одного метасимвола.
    27. Буквализовывать (отменять специальное значение) все метасимволы, заключенные между символами одинарных кавычек.
    28. Перечислить метасимволы, сохраняющие специальное значение между символами двойных кавычек.
    29. Использовать символы двойных кавычек для буквализации (отмены специального значения) заключенных в них метасимволов.
    30. Применять более чем один метод буквализации внутри одной и той же командной строки.

Создание и выполнение процедур Shell

Цели

    1. Создавать простую процедуру shell.
    2. Помещать в нее пустые строки и комментарии.
    3. Выполнять эту процедуру.
    4. Определить термин процесс
    .
    5. Определить отношение между процессом-предком и процессом-потомком.

Создание процедуры Shell

Процедура Shell - это файл, содержащий команды shell (командный файл). Эти процедуры имеют большое значение поскольку они:

Создание процедуры shell и C-программы в ОС UNIX похожи. В обоих случаях в файл редактором вводятся команды Для запуска как процедуры shell, так и C-программы необходим выполняемый файл.

В отличие от языка C, shell - интерпретирующий язык и процедуры shell не нужно компилировать. Исходный файл является выполняемым и должен иметь права доступа читать (read) и выполнять (execute). Право доступа выполнять присваивает файлу команда chmod. Для выполнения файла, нужно, в ответ на подсказку, набрать на клавиатуре его имя и нажать клавишу <RET>.

В этом курсе Вы выполняете процедуры shell неявно. Неявное выполнение процедур или программ shell означает, что Вы:

1. Создаете процедуру используя текстовый редактор.

2. Присваиваете командному файлу право доступа выполнять командой chmod.

3. Выполняете командный файл, набирая на клавиатуре его имя, как имя команды.

На примере 1 справа процедура c именем nfiles выводит число строк в листинге Вашего текущего каталога. Ее можно создать любым редактором, например, vi. Затем присвойте файлу право доступа выполнять командой chmod. Для выполнения наберите, в ответ на подсказку $, имя файла nfiles и <RET>.

Имена файлов процедур shell можно выбирать произвольно, но имена стандартных команд ОС UNIX, такие как cat, ls, pwd, применять не следует.

Если Вы не присвоили файлу право доступа выполнять с помощью команды chmod, выводится сообщение об ошибке. Например:

$nfiles<RET>
nfiles: execute permission denied
$

Это значит, что файл nfiles не имеет право доступа выполнять. Команда ls -l выведет текущие права доступа. Измените их командой chmod и выполните файл.

СОЗДАНИЕ ПРОЦЕДУРЫ SHELL

ПРИМЕР 1:

(текст файла nfiles был создан с помощью редактора vi)

$ cd<RET>

$ cd unit6<RET>

$ cat nfiles

ls | wc -l

pwd

$


$ nfiles<RET>

nfiles: execute permission denied

$

$ chmod 755 nfiles
$

$ ls -l nfiles<RET>

-rwxr-xr-x 1 slf train 4 Dec 7 08:35 nfiles
$


$ nfiles<RET>

35

/home/stu2/unit6
$

Комментарии и пустые строки

Выполняя процедуру, shell читает и выполняет каждую строку содержащего ее файла. Строки, начинающиеся с символа # или любые символы, следующие за #, shell интерпретирует как комментарий. Комментарии завершаются символом <RET> в конце строки. Кроме того интерпретатор shell игнорирует пустые строки.

Это очень полезная привычка - помещать комментарии в процедуру shell чтобы облегчить понимание ее текста. Пустые и начинающиеся с символа # строки облегчают чтение процедуры.

КОММЕНТАРИИ И ПУСТЫЕ СТРОКИ

# Эта процедура shell с именем nfiles выводит количество # # строк в листинге Вашего текущего рабочего каталога # ls | wc -l # вывести листинг текущего каталога # и связать в конвейер эту команду ls # с командой вывода количества строк wc -(lines) pwd # вывести имя каталога, # в котором только что подсчитали строки

#################################################################
#                                                               #
# Комментарии легче читать, если они окружены этими символами   #
# Это хорошая привычка для выделения информации                 #
#                                                               #
#################################################################

Создание нового процесса

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

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

Процесс shell интерпретирует строки команд ОС UNIX. Во время сеанса работы за терминалом может быть несколько одновременно выполняющихся процессов shell. При этом любой из них интерпретирует один уровень команд (команды из одного файла). Например, один процесс shell интерпретирует строки команд в программе, вызванной из входного shell; это один уровень команд. Другой процесс shell может интерпретировать строки команд, набираемых на клавиатуре терминала и это другой уровень команд.

Например входной процесс shell интерпретирует строку команды, введенную с терминала:

$ nfiles file*<RET>

При этом он выполняет генерацию имени файла, согласно указанию в параметре file*. Другой процесс shell интерпретирует строки команд в файле nfiles этой процедуры.

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

Каждый процесс имеет уникальный номер идентификации, называемый PID (Process Identification Number). Несмотря на то, что у родительского процесса и его потомка данные образа процесса совпадают, и номера идентификации различны. Команда ps - статус процессов, выводит PID всех выполняющихся в этот момент процессов, она обсуждается в разделе 8.

СОЗДАНИЕ НОВОГО ПРОЦЕССА

РОДИТЕЛЬСКИЙ ПРОЦЕСС:

- Выводит подсказку shell: $ nfiles

- Передает образ процесса

процессу потомку

ПРОЦЕСС ПОТОМОК:

- Интерпретирует строки ls | wc-l

команд в процедуре: pwd

Создание нового процесса(продолжение)

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

Например процесс shell, выводящий подсказку $, это родительский процесс. Другой процесс shell выполняет строку команды, введенную в ответ на подсказку, это процесс потомок.

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

Откомпилированные программы выполняются иначе, чем процедуры shell.

Выполнение откомпилированных программ

ОС UNIX имеет ядро, которое находится в оперативной памяти и утилиты, которые находятся на диске. Команды shell, такие как mailx, banner и cat - это утилиты, представляющие собой откомпилированные программы, написанные на языке C.

При выполнении откомпилированной программы shell интерпретирует строку команды и создает новый процесс (потомок), который выполняет эту программу. Когда этот потомок выполняет откомпилированную программу, он саморазрушается, то есть трансформирует себя в новый процесс.

Например, если интерактивный shell (родительский) получил для интерпретации набранную Вами строку команды, то новый shell (потомок) определяет, является ли набранная команда процедурой shell или откомпилированной программой. Во втором случае он саморазрушается для запуска откомпилированной программы.

По умолчанию входной shell -это выполняющаяся в данный момент программа с именем /bin/sh. Shell - потомок первоначально запускает /bin/sh до тех пор пока она не замещается откомпилированной программой.

Выполнение процедур shell

Различие между выполнением процедур shell (не откомпилированных программ) и откомпилированных программ состоит в том, что при выполнении процедур shell запускается большее количество shell процессов.

При выполнении процедур shell интерактивный (входной) shell интерпретирует строку команды и создает новый процесс (потомок), который и интерпретирует эту процедуру shell.

В следующем примере процедура shell из файла scripter вызывается через входной shell.

Процедура имеет следующий текст:

$ cat scripter<RET>
who
date
$

Для запуска этой процедуры shell:

1. Входной shell создает shell-потомок, который должен проинтерпретировать две строки команд: who и date.

2. Этот shell-потомок интерпретирует команды, создавая процессы - "внуки входного shell" для каждой из них. Эти обе команды являются откомпилированными программами, они выполняются на одном и том же уровне, поскольку принадлежат одному файлу.

- Поскольку who - откомпилированная программа, создается еще один новый процесс shell, заменяемый затем процессом who.

- Другой новый процесс shell создается для команды date. Поскольку date - также откомпилированная программа, этот процесс также заменяется, но процессом date.

3. При выполнении команд who и date существует три процесса shell, родительский, потомок и "внук". При этом команды выполняются процессами "внуками". Процесс потомок прекращает выполнение после завершения выполнения команд who и date.

ВЫПОЛНЕНИЕ ПРОЦЕДУР SHELL

$ cat scripter<RET>
who
date
$

Выводы и упражнения

Выводы по уроку

В этом уроке описаны:

Процедура shell: файл, содержащие команды shell.

Значение процедур shell:

- они освобождают от набора на клавиатуре часто используемых команд;
- упрощают задачу запуска (submit) сложных команд;
- позволяют настроить стандартные команды ОС UNIX;
- позволяют создавать новые команды.

Создание процедур shell:

- создать файл с процедурой с помощью текстового редактора vi;
- присвоить этому файлу права доступа выполнять;
- неявно выполнить файл.

Помещение комментариев и пустых строк в текст процедуры shell:

Создание нового процесса:

- родительский процесс создает процесс-потомок;
- процесс-потомок наследует образ процесса от родительского;
- различайте процессы родительский и потомок с помощью PID;
- процесс потомок создается по разному для откомпилированных программ и процедур shell;
- для откомпилированных программ, процесс-потомок запускает /bin/sh, который затем перекрывается этой программой.

Выполнение процедур shell:

- интерактивный shell интерпретирует строку команды;
- этот shell создает новый процесс-потомок;
- этот процесс-потомок интерпретирует команды в файле процедуры shell.

Упражнение 6.1.A

1. Создайте процедуру shell с именем script1, которая:

a.

- выводит текущие дату и время;

- выводит календарь текущего месяца;

- выводит содержимое файла pat, находящегося в Вашем текущем рабочем каталоге;

- содержит комментарии, описывающие ее работу.

b. Выполните процедуру script1, чтобы проверить ее работу.

2. Создайте процедуру shell с именем allcaps, которая

a.

- выводит содержимое файла phone;

- переводит все строчные (нижнего регистра) буквы в файле phone в заглавные (верхнего регистра), отображая результат на экране терминала.

b. Присвойте файлу с процедурой allcaps такие права доступа, чтобы Вы могли его читать, писать и выполнять, но чтобы никто кроме Вас не мог это делать.

c. Выполните процедуру allcaps, чтобы проверить ее работу.

d. Выполните процедуру allcaps таким образом, чтобы ее результаты выводились одновременно на экран и в файл с именем seeit

3. Создайте процедуру shell с именем whoson, которая:

a.

- выводит в стиле заголовка (banner) слова users now: (сейчас пользуются системой:) на одной строке;

- реализует поиск всех студентов, которые работают с ОС UNIX в настоящий момент и выводит данные о них в порядке убывания длительности времени их работы.

b. Выполните процедуру whoson, чтобы проверить ее работу.

4. Создайте процедуру shell с именем information, которая использует команды cut и paste для реорганизации данных из файлов phone.them (звонить им) и days (дни) и записывает результат в новый файл с именем phone.when (когда звонить).

Файл phone.them содержит имена и фамилии, поле "Yes/No" и номера телефонов. Эти поля разделены символами пробелов (символ табуляции не использован). Поле phone number (номер телефона) занимает в строке файла phone.them позиции 31-45.

Файл days содержит фамилии, номера телефонов, и дни недели, когда человека c этой фамилией можно застать на его рабочем месте. Поле day (день недели) занимает в строке файла days позиции 29-40.

Порядок следования имен и фамилий в обоих файлах совпадает. Нужно использовать имена и фамилии из файла phone.them. Файл phone.when должен содержать следующие колонки:

имя фамилия номер_телефона день_недели

5. Закончите диаграмму процессов при выполнении файла test1, если его имя введено в ответ на подсказку $, а содержимое необходимых файлов имеет вид:

$ cat test1<RET> $ cat testa<RET>
testa date
who




$test1<RET>

Переменные

Цели

    1. Описать переменные, которые создаются shell автоматически.
    2. Выполнять команду
    set для вывода имен и значений всех переменных в Вашем входном shell.
    3. Выполнять команду
    env для вывода значений переменных среды.
    4. Использовать команду
    export, чтобы разрешить нескольким процессам shell одновременно использовать имена и значения переменных.
    5. Использовать оператор
    echo для вывода значений отдельных переменных.
    6. Определить типы переменных, допустимые в shell.
    7. Определить имена переменных, допустимые в shell.
    8. Использовать оператор присваивания и оператор
    read для присвоения переменным значений.
    9. Использовать подстановку команд для присвоения значения переменной.
    10. Использовать символы, завершающие значение переменной shell в операторе присваивания.
    11. Защищать оператор присваивания значения переменной от действий специальных символов (метасимволов).
    12. Соединять значения переменных.
    13. Использовать позиционные параметры.
    14. Использовать специальную переменную параметров
    $*.

Переменные shell

В ОС UNIX большой выбор различных программ shell. Вы взаимодействуете с Вашим собственным shell, отличным от shell других пользователей. Ваш shell содержит Ваш собственный набор переменных shell, которые Вы можете использовать. Переменная имеет имя и значение. Shell автоматически создает эти переменные, но Вы можете свободно их изменять.

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

Набор переменных среды создается автоматически при входе в ОС UNIX и существует до выхода из нее. Среда содержит такие установки как вид Вашей диалоговой подсказки, тип терминала, каталог, который будет текущим после входа и т.п. Изменения, которые Вы делаете в Ваших среде и переменных shell не влияют на других пользователей.

СТАНДАРТНЫЕ ПЕРЕМЕННЫЕ SHELL

Эти переменные перечисляются ниже. ОС UNIX автоматически присваивает значения некоторым из них, остальным Вы должны присвоить значения перед использованием. Заметьте, что имена всех стандартных переменных состоят из заглавных букв.

PATH Когда Вы вводите команды, такие как date, who и т.п., Вы запрашиваете у shell выполнение программы. Перед ее выполнением shell должен найти содержащий ее файл. Для этого shell должно быть известно, в каких каталогах файловой системы осуществлять поиск. Значением переменной PATH (путь) является текстовая строка, содержащая список каталогов, в которых нужно искать файлы команд. Имена каталогов в списке должны быть разделены символами двоеточия. Значение этой переменной по умолчанию - /usr/bin.

Администратор ОС UNIX может добавить другие каталоги к значению переменной PATH, например:

/usr/bin:/home/jas/bin::

Такая запись означает:

- сначала искать в /usr/bin

- затем искать в /home/jas/bin

- наконец искать в текущем каталоге (на него указывает последний символ двоеточия).

Вы также можете добавить каталоги в этот список. После имени каждого каталога нужно помещать символ двоеточия.

ПЕРЕМЕННЫЕ SHELL

Переменная это имя, имеющее значение

СТАНДАРТНЫЕ ПЕРЕМЕННЫЕ SHELL

Переменная Содержание
PATH каталоги для поиска команд
EXINIT режимы по умолчанию для редактора
HOME домашний каталог пользователя
LOGNAME входное имя пользователя
LPDEST имя принтера, используемое по умолчанию командой lp
MAIL имя каталога с файлом почты (mail)
MAILCHECK количество секунд между проверками прибытия почты
PS1 первичная подсказка
PS2 вторичная подсказка
TERM тип терминала
TZ зона поясного времени в формате EST5EDT, используемая командой date

Стандартные переменные SHELL (продолжение)

EXINIT Список режимов редактора vi, которые будут устанавливаться при каждом его вызове. Например можно установить режим при котором будут отображаться номера строк. Эта переменная не получает значения автоматически.

HOME Имя входного каталога. Автоматически получает значение при выполнении процедуры входа.

LOGNAME Ваш входной идентификатор пользователя. Автоматически получает значение при выполнении процедуры входа. LOGNAME используется, когда Вы посылаете почту. Ее получатель видит значение этой переменной в строке "from" (от кого).

LPDEST Имя Вашего принтера по умолчанию, используется командой lp. Эта переменная не получает значения автоматически.

MAIL Команда mailx читает файл содержащий поступающую Вам почту. Эта переменная содержит полное имя каталога, содержащего этот файл (/var/mail/login) и автоматически получает значение при выполнении процедуры входа.

MAILCHECKРаботая в ОС UNIX, Вы периодически получаете сообщение you have mail (Вам поступила почта), при поступлении Вам новых почтовых сообщений. Значение этой переменной определяет частоту проверки почтового файла на их наличие, по умолчанию оно равно 600 секунд. Если это значение - 0, то shell будет проверять наличие новой почты каждый раз, когда он готов вывести подсказку.

PS1 Ваша первичная подсказка shell. Если эта переменная не имеет значения, то выводятся символы "$" и пробел.

PS2 Вторичная подсказка shell. Она выводится, если Вы вводите неполную строку команды, содержащую, например, открывающую кавычку без закрывающей. При ее появлении (по умолчанию символ ">") нужно или завершить команду, или, нажав клавишу <DELETE>, удалить команду.

TERM Тип используемого Вами терминала. Редактору vi, команде pg и некоторым другим, необходимы данные о типе терминала для управления движением курсора и других целей. Этой переменной нужно присвоить значение, соответствующее кодовому обозначению Вашего терминала, например vt100, 5420 и т.п. Если Вы не знаете тип терминала, обратитесь к администратору ОС UNIX. Присвоение этой переменной значения в начале сеанса работы - хорошая практика. Значение по умолчанию - 450 твердая копия, возможно Вы не захотите им пользоваться.

TZ Ваша зона поясного времени, выраженная в последовательности аббревиатур, указывающих зону поясного времени, расстояние ее в часах относительно Гринвичского меридиана и летнее время.

Вывод имен и значений переменных SHELL

Для этой цели в ОС UNIX предусмотрено две команды set и env.

Команда set.

Выводятся имена и значения всех переменных доступных только Вашему текущему shell

Команда env.

Выводятся имена и значения переменных Вашей среды (доступные командам, отличным от текущего shell). Эти переменные называются также переменными среды. Преимуществом превращения переменной в переменную среды является то, что о ее существовании будет известно другим программам.

ВЫВОД ИМЕН И ЗНАЧЕНИЙ

ПЕРЕМЕННЫХ SHELL

ВСЕ ПЕРЕМЕННЫЕ ПЕРЕМЕННЫЕ СРЕДЫ

$ set<RET> $ env<RET>

EDITOR=/usr/bin/vi MAILCHECK=10

ENV=/home/slf/.env PS1=hi:

HOME=/home/slf LOGNAME=slf

LOGNAME=slf HOME=/home/slf

MAIL=/var/mail/slf PATH=/usr/bin

MAILCHECK=10 SHELL=/usr/lbin/ksh

PATH=/usr/bin MAIL=/var/mail/slf

PS1=hi: TERM=vt100

PS2=> TZ=EST5EDT

SHELL=/usr/lbin/ksh $

TERM=vt100

TZ=EST5EDT

$

.

Команда export

Если Вам нужно использовать переменные в программах, отличных от текущего shell, то их можно передать в среду. Для этого используется команда export. Чтобы экспортировать переменную, нужно, в ответ на подсказку ввести:

$ export имя_перем_1 имя_перем_2 имя_перем_3 . . . <RET>

В примере 1 справа показано, как экспортировать переменные TERM и PATH с помощью команды:

$ export TERM PATH<RET>

Можно также использовать команду export внутри процедур shell, что позволяет различным процессам shell использовать переменные одновременно. При этом экспортировать переменные можно только для процессов потомков и их потомков. При завершении этих процессов экспортированная для них переменная прекращает существование вместе с ними. Тем не менее родительские копии переменных остаются активными.

Например, пусть программа с именем parent (родитель) экспортирует переменную TERM и parent вызывает программу child (потомок), которая, в свою очередь, вызывает программу grandchild (внук). Переменная TERM при этом доступна во всех трех программах до тех пор, пока не завершится программа parent.

Для вывода списка имен (без значений!) переменных, экспортированных текущим shell, нужно выполнить команду export без параметров. Это можно сделать в ответ на подсказку, либо в тексте процедуры shell. См. пример 2, справа.

КОМАНДА export

export имя_перем_1 имя_перем_2 имя_перем_3

ПРИМЕР 1:

$ export TERM PATH<RET>

$

ПРИМЕР 2:

$ export<RET>

export HOME

export LOGNAME

export MAILCHECK

export PATH

export PS1

export PS2

export TERM

$

Подстановка переменной

Можно получить доступ к значению переменной помещая перед ее именем символ $. Между ним и именем не должно быть пробелов. Символ $ перед именем переменной указывает shell, что вместо этой комбинации символов нужно поместить значение переменной. Этот механизм называется подстановка переменной.

В примере 1, справа, содержимое Вашего входного каталога выводится с помощью команды:

$ ls $HOME<RET>

В этом примере shell подставляет в команду, до ее выполнения, значение переменной HOME вместо комбинации $HOME. После того, как shell выполнит подстановку, команда ls выведет список файлов входного каталога. Символ $ не используется при присвоении переменной значения.

В примере 2 выполняется поиск в файле паролей строк, содержащих Ваш пользовательский входной идентификатор, с помощью команды:

$ grep ${LOGNAME}: /etc/passwd<RET>

В примере 3 имя входного каталога используется как часть имени пути при установке нового текущего каталога.

$ cd {HOME}/fun/morefun<RET>

Использование фигурных скобок {} при подстановке переменных рассматривается в этом уроке позднее.

ПОДСТАНОВКА ПЕРЕМЕННОЙ

Чтобы получить доступ к значению переменной, поместите перед ее именем символ $

ПРИМЕР 1:

$ ls ${HOME}<RET>

bin calendar junk names unit10 unit5 unit8
books fun look numbers unit3 unit6 unit9
books1 groceries lunchfile phone unit4 unit7
$

ПРИМЕР 2:

$ grep ${LOGNAME}: /etc/passwd<RET>
slf:x:354:704354 X4689 S. French (PC) (0324):/home/slf

$

ПРИМЕР 3:

$ cd ${HOME}/fun/morefun<RET>

$ pwd<RET>

/home/stu2/fun/morefun
$

Команда echo

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

$ echo I would like to be ambidextrous<RET>
I would like to be ambidextrous

Эту команду можно использовать в процедурах shell для вывода сообщений, как это показано в примере 2 на странице справа.

ВЫВОД ЗНАЧЕНИЙ ПЕРЕМЕННЫХ С ПОМОЩЬЮ КОМАНДЫ echo

С помощью команды echo можно выводить значения переменных. Если команды env и set обеспечивают вывод всех переменных среды или всех переменных shell и их значений, то команда echo, с использованием механизма подстановки переменных, позволяет вывести значение любой указанной переменной

Например, чтоб вывести значение переменной TERM, нужно выполнить команду:

$ echo $TERM<RET>

vt100

См. Пример 3, справа.

В примере 4 показан вывод значения TERM из процедуры shell с именем term.

$ cat term<RET>

date

echo $TERM

См. Пример 4, справа.

КОМАНДА echo

ПРИМЕР 1:

$ cd<RET>

$ echo Вводите ответ здесь:<RET>

Вводите ответ здесь:

ПРИМЕР 2:

$ cat single<RET>

echo I do not want to see double and will not here.

$ single<RET>

I do not want to see double and will not here.

$

ПРИМЕР 3:

>$ echo $PATH<RET>

/usr/bin:/usr/lbin:/usr/3bnet/bin::
$

ПРИМЕР 4:

$ cat seepath<RET>

echo $PATH

$ seepath<RET>

/usr/bin:/usr/lbin:/usr/3bnet/bin::

$

Вывод значений переменных с помощью команды echo (продолжение)

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

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

\n - новая строка

\t - горизонтальная табуляция

\b - возврат на шаг (backspace)

\c - неразрывность строки (команда echo обычно после вывода строки выводит символ перехода на новую строку)

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

ВЫВОД ЗНАЧЕНИЙ ПЕРЕМЕННЫХ (продолжение)

ПРИМЕР 1:

$ cat echoit<RET>

echo The value of TERM is:(Знач. переменной TERM:)

echo $TERM

$ echoit<RET>

The value of TERM is:

vt100

$

ПРИМЕР 2:


$ cat oneline<RET>

echo "Try to keep \c" (Попробуйте удержать)

echo this on one line. (это на одной строке)

$ oneline<RET>

Try to keep this on one line.

$

Имена переменных

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

Определение Ваших собственных имен переменных shell.

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

Имя переменной может состоять из любого количества символов, причем ВСЕ они являются значимыми.

Поскольку количество символов в имени не ограничивается следует по возможности усиливать его описательную силу, чтобы облегчать чтение программ.

Первым символом имени должна быть буква или подчеркивание.

Цифра не может быть первым символом имени.

Символы имени, отличные от первого, могут быть буквенными, цифровыми или символом подчеркивания (_).

Использовать другие символы для порождения имени не разрешается.

Заглавные и строчные буквы считаются различными.

Имена стандартных переменных shell состоят только из заглавных букв. Неплохо при создании собственных переменных давать им имена, содержащие все или несколько строчных букв, что позволит легко отличать эти имена от стандартных.

ИМЕНА ПЕРЕМЕННЫХ

ВСЕ ПЕРЕМЕННЫЕ SHELL ИМЕЮТ ПО УМОЛЧАНИЮ СТРОКОВЫЙ ТИП

ИМЯ МОЖЕТ БЫТЬ ЛЮБОЙ ДЛИНЫ

ВСЕ ЕГО СИМВОЛЫ ЗНАЧИМЫЕ

ДОПУСТИМЫЕ СИМВОЛЫ

- Буквенные
- Цифровые
- Подчеркивание

ИМЯ ДОЛЖНО НАЧИНАТЬСЯ СИМВОЛОМ БУКВЫ ИЛИ ПОДЧЕРКИВАНИЯ

СПЕЦИАЛЬНЫЕ СИМВОЛЫ ИСПОЛЬЗОВАТЬ В ИМЕНИ НЕЛЬЗЯ

ЗАГЛАВНЫЕ И СТРОЧНЫЕ БУКВЫ СЧИТАЮТСЯ РАЗЛИЧНЫМИ

Операторы присваивания

Существует три основных способа присвоить переменной значение. Первый - с помощью оператора присваивания (символ равенства, =) в формате:

ИМЯ_ПЕРЕМ=значение

Правила использования оператора присваивания:

НЕЛЬЗЯ помещать символы пробелов рядом со знаком равенства.

Нужно заключать присваиваемое значение в одинарные или двойные кавычки, если оно содержит белые пробелы, т.е. несколько символов пробелов или табуляций. Другими словами, если значение не является единственным словом, его нужно заключить в кавычки. Это демонстрируется в примерах 1 и 2 на странице справа.

Значение нужно также заключать в одинарные или двойные кавычки, если оно содержит специальные символы (метасимволы) shell, такие, например, как ">". Эти специальные символы обсуждаются в уроке 4 (буквализация метасимволов) в этом разделе.

Строка, которую Вы набираете после оператора присваивания (знака равенства), становится значением переменной, имя которой стоит слева от него. Оператор заканчивается нажатием клавиши <RET>. Для проверки можно вывести присвоенное значение с помощью команды echo, как это показано в примере 3 на странице справа.

С помощью оператора присваивания можно присваивать значения как стандартным переменным shell, так и созданным Вами переменным. Оператор присваивания можно использовать как из командной строки (в ответ на подсказку $), так и внутри процедуры shell. Можно также присвоить переменной значение, используя значение другой переменной, как это делается в примере 3, на странице справа.

ОПЕРАТОРЫ ПРИСВАИВАНИЯ

ИМЯ_ПЕРЕМ=значение

ПРИМЕР 1:

$ directory=/home/slf/uc1080<RET>

$ echo $directory<RET>

/home/slf/uc1080

$

ПРИМЕР 2:

$ numbers="один два три четыре пять шесть"<RET>

$ echo $numbers<RET>

один два три четыре пять шесть

$

ПРИМЕР 3:

$ echo $PATH<RET>

/usr/bin

$ PATH=$PATH:/home/bin::<RET>

$ echo $PATH<RET>

/usr/bin:/home/slf/bin::

$

Удаление переменных

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

$ имя_перем=<RET>

См. пример 1 на странице справа.

Чтобы удалить переменную полностью нужно использовать команду unset.

$ unset имя_перем<RET>

После использования команды unset полезно проверить факт удаления с помощью команды set, как это показано в примере 2, на странице справа.

УДАЛЕНИЕ ПЕРЕМЕННЫХ

ПРИМЕР 1:

$ numbers=<RET>

$ echo $numbers<RET>

$

ПРИМЕР 2:

$ a=один<RET>

$ b=два<RET>

$ c=три<RET>

$ set<RET>

a=один

b=два

c=три

directory=/home/slf/uc1080

numbers=

$ unset a b c<RET>

$ set<RET>

directory=/home/slf/uc1080

numbers=

$

Команда read

Второй способ присвоения переменной значения - использование команды read. В процедурах shell команда read получает значения данных с клавиатуры терминала и присваивает их переменным. Команда не выдает подсказку для ввода, поэтому следует использовать команду echo для создания собственных подсказок.

Команда read имеет следующий формат:

read имя_перем1, имя_перем2 ...

Одна команда может выполнить чтение значений нескольких переменных.

В примере 1, на странице справа, процедура shell с именем telltime запрашивает зону поясного времени, читает Ваш ответ, присваивая значение стандартной переменной shell TZ, и экспортирует эту переменную в среду. Затем эта процедура сообщает Вам дату и время, согласно введенному значению зоны.

Там же, в примере 2, приводится процедура shell с именем readname, читающая и присваивающая значения трем разным переменным. Она выводит присвоенные значения на терминал и добавляет их к содержимому файла fullnames.

Команда read использует имена переменных, а не их значения, поэтому задаваемые в ней имена не должны начинаться с символа $.

При попытке чтения неопределенного значения переменная получает пустое значение.

$ cat readthree<RET>

echo "Enter three values: \c" (Введите три значения)

read one two three

echo The values are $one, $two, $three (Значения равны)

$ readthree<RET>

Enter three values: 1 2

The values are 1, 2,

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

$ cat readthree.1<RET>

echo "Enter three values: \c"

read one two three

echo The values are $one, $two,

echo $three

$ readthree.1<RET>

Enter three values: 1 2 3 4 5

The values are 1, 2,

3 4 5

КОМАНДА read

ПРИМЕР 1:

$ cd unit6<RET>

$ cat telltime<RET>

echo "Today is:"

date

echo "What time zone shall I search? \c"

(Какую зону поясного времени мне искать ?)

read TZ

export TZ

echo "The $TZ time is:"

(Время и дата поясной зоны $TZ)

date

$ telltime<RET>

Today is:

Fri Oct 15 12:22:31 EST 1989

What time zone shall I search? GMT0<RET>

The GMT0 time is:

Fri Oct 15 17:22:36 GMT 1989

$

ПРИМЕР 2:

$ cat readname<RET>

echo "Enter your first name, middle name, and last name:"

(Введите Ваши фамилию, имя и отчество)

read fname mname lname

echo "The first name you entered is: $fname"

echo "The middle name you entered is: $mname"

echo "The last name you entered is: $lname"

echo $fname $mname $lname >> fullnames

$ readname<RET>

Enter your first name, middle name, and last name:

Shari Lynn French<RET>

The first name you entered is: Shari

The middle name you entered is: Lynn

The last name you entered is: French

$

$ cat fullnames<RET>

Shari Lynn French

$

Подстановка команды

Третий способ присвоения значения переменной - подстановка команды. Под этим понимается использование результата выполнения команды в командной строке. Это полезно, когда необходимо:

Передать результаты выполнения команды как параметры другой команде.

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

Выражение подстановки команды есть команда shell, заключенная в обратные апострофы (обратные одинарные кавычки). Вот примеры выражений подстановки команды:

x=`pwd`
y=`who | grep somers
`
z=`ls -l`

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

Выражение подстановки команды может появиться в любом месте командной строки. Shell заменяет эти выражения на результат выполнения команды.

В примере 1, на странице справа, выводится текущий день недели. Используя механизм подстановки команды, shell передает команде echo в качестве параметра результат выполнения команды date.

Там же, в примере 2, определяется текущее количество активных пользователей с помощью команды who | wc -l. При этом результат выражения подстановки команды `who | wc -l` присваивается переменной users. Ее значение выводится с помощью команды echo с параметром в виде подстановки переменной.

ПОДСТАНОВКА КОМАНДЫ

ПЕРЕДАЕТ РЕЗУЛЬТАТЫ ВЫПОЛНЕНИЯ КОМАНДЫ КАК ПАРАМЕТРЫ ДРУГОЙ КОМАНДЕ

ПРИСВАИВАЕТ РЕЗУЛЬТАТ ВЫПОЛНЕНИЯ КОМАНДЫ ПЕРЕМЕННОЙ, КАК ЗНАЧЕНИЕ

- Выражение заменяется стандартным выводом команды, помещенной в обратные апострофы

ПРИМЕР 1:

$ echo today is `date +%A`<RET>

today is Monday

$

ПРИМЕР 2:

$ users=`who | wc -l`

$ echo There are $users users on the system.

There are 24 users on the system.

(В системе 24 пользователя)

$

Символы завершения строкового значения в операторе присваивания

Значение, присваиваемое переменной должно быть строкой символов. Это значение может располагаться более чем в одной строке (на экране) для одной переменной. Например:

$ address="123 Disk Drive<RET>

> Grover's Mill, New Jersey"<RET>

Поясним значение некоторых элементов этого примера:

1. Присваиваемое значение начинается с символа двойной кавычки ("), потому что оно содержит белые пробелы и специальные символы.

2. Вторая строка начинается с символа >. Это вторичная подсказка (PS2), выводимая shell ОС UNIX. Ее вывод означает, что shell считает Ваш ввод незавершенным и ожидает его продолжения. Первичная подсказка ($) не будет выведена до тех пор, пока Вы не завершите правильно оператор или команду, либо не удалите ее нажатием клавиши <DELETE>. В примере с переменной birthinfo, на странице справа, shell ожидает ввода завершающей двойной кавычки.

3. Присваиваемое значение завершается символом двойной кавычки ("). Это указывает shell, что конец строки достигнут.

4. Когда shell определяет, что строка завершена, он выполняет присваивание.

Если оператор присваивания неверен, то выводится сообщение об ошибке, а присваивание не производится.

Специальные символы

Строка может содержать любые символы, но старайтесь не применять внутри строки следующие из них:

перевод_строки пробел табуляция ; ) ( | > < & $ ' " `

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

Например значение переменной address, полученное с помощью
$ echo $address<RET>, будет иметь вид:
123 Disk Drive Grover's Mill, New Jersey
При присвоении этого строкового выражения переменной address после слова Drive был использован символ "перевод строки". Его специальное значение было удалено с помощью символов двойных кавычек. При этом символ "перевод строки" трактуется shell как символ пробела или табуляции.

СИМВОЛЫ ЗАВЕРШЕНИЯ СТРОКОВОГО ЗНАЧЕНИЯ В ОПЕРАТОРЕ ПРИСВАИВАНИЯ

Значение, присваиваемое переменной не должно содержать следующие специальные символы

перевод_строки пробел табуляция ; ) ( | > < & $ ' " `

Если требуется, заключайте строку в кавычки

$ name="Scott D. Steward"

$ redirect="cat file2 > file2.old"

$ birthinfo="February 1, 1958<RET>

> Lucas County<RET>

> Toledo, Ohio"<RET>

$

$ echo $birthinfo<RET>

February 1, 1958 Lucas County Toledo, Ohio

$

Соединение значений переменных

Конструкция $имя_перем называется выражение подстановки переменной, она приводит к подстановке вместо $имя_перем значения этой переменной. Вот примеры выражений подстановки переменных:

$TERM $address

${TERM} ${address}

Если Вы имеете доступ к значениям переменных, то Вы можете соединять их (т.е. выполнять конкатенацию значений). Для этого нужно поместить выражения подстановки переменных последовательно одно за другим.

В примере 1, на странице справа, переменная directory содержит имя пути каталога, а переменная filename - имя файла в этом каталоге. Полное имя этого файла можно получить соединением (конкатенацией) выражений подстановки для этих переменных.

Можно также соединять значения переменных с другими выражениями или символами, например с какими либо словами или с символом наклонной черты. Например, если значение переменной directory не заканчивается символом косой черты, а значение переменной не начинается с такого символа, то можно поместить его между выражениями подстановки этих переменных, как показано в примере 2, на странице справа.

Интерпретатор строки команды не рассматривает местонахождение выражений, он просто выполняет указанные в них подстановки и пытается интерпретировать их результат. В примере 2, на странице справа значение переменной directory соединяется с символами uc1080/unit6.

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

1) /home/stu2/unit6

2) /home/stu2/unit6old

Для доступа к подкаталогу, заканчивающемуся на old нужно выполнить команды:

$ directory=/home/stu2/unit6<RET>

$ cd ${directory}old<RET>

Существует отличие между $directoryold и ${directory}old. Запись $directoryold означает выражение подстановки для переменной directoryold, поскольку эта последовательность состоит из символов, допустимых для имени переменной. Переменная shell с именем directoryold не существует и чтобы избежать двусмысленности нужно использовать фигурные скобки.

В примере 3, справа, команда cd получает в качестве параметра пустое значение переменной directoryold и поэтому переходит во входной каталог.

СОЕДИНЕНИЕ ЗНАЧЕНИЙ ПЕРЕМЕННЫХ

ПРИМЕР 1:

$ directory=/home/slf/uc1080/<RET>

$ filename=unit6<RET>

$ echo ${directory}${filename}<RET>

/home/slf/uc1080/unit6

ПРИМЕР 2:

$ directory=/home/slf<RET>

$ echo ${directory}/uc1080/unit6<RET>

/home/slf/uc1080/unit6

ПРИМЕР 3: Существующие каталоги

/home/stu2 <-входной каталог

/home/stu2/unit6

/home/stu2/unit6old

$ directory=/home/stu2/unit6<RET>

$ cd $directoryold<RET>

$ pwd<RET>

/home/stu2 <-опять входной каталог, directoryold
не существует; не имеет значения

$ cd ${directory}old<RET>

$ pwd<RET>

/home/stu2/unit6old

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

Вы можете передавать данные процедуре shell с помощью параметров, указанных в строке команды. Это так называемые позиционные параметры. Они доступны для некоторых операций внутри процедуры shell. Значение позиционного параметра нельзя изменить с помощью оператора присваивания.

Например, если процедура shell выполняет действия с файлом, его имя может быть задано в строке команды как позиционный параметр. В примере 1, на странице справа, показано имя файла, использованное как позиционный параметр процедуры shell с именем sort.file.

Имена, связанные с позиционными параметрами есть десятичные целые числа от 1 до 9. Имя первого параметра - 1, второго -2 и так далее до 9.

Для доступа к значению позиционного параметра внутри процедуры shell нужно использовать выражение постановки переменной $1 или ${1} для первого параметра, $2 для второго и т.д., как это показано в примерах 1 и 2 на странице справа.

Позиционный параметр ${0}

Параметр $0 или ${0} является специальным и создается автоматически. Его значением является текстовая строка, содержащая имя использующей его процедуры shell. Доступ к этому параметру внутри процедуры shell такой же, как к остальным позиционным параметрам.

Если позиционный параметр используется в процедуре shell, но его значение не было определено в строке команды, то считается, что он имеет пустое значение. В примере 2 показано использование параметра ${0} и пустое значение пятого позиционного параметра.

ПОЗИЦИОННЫЕ ПАРАМЕТРЫ

ПРИМЕР 1:

$ cat sort.file<RET>

sort ${1}

$ sort.file phonelist<RET>

jo x1111

mona x1112

shari x1113

ПРИМЕР 2:

$ cat teatime<RET>

echo $2 for $1

echo and $1 for $2

echo $3 for $4

echo and $4 for $3

echo "The name of this program is ${0}"

echo "The fifth positional parameter is ${5}"

$ teatime two tea me you<RET>

tea for two

and two for tea

me for you

and you for me

The name of this program is teatime

The fifth positional parameter is

$

Позиционные параметры (продолжение)

Предопределенная переменная shell ${#}

Выражение предопределенной переменной ${#} имеет значение количества позиционных параметров, переданных процедуре shell (т.е. указанных в строке команды). Это значение часто используется для проверки правильности количества переданных параметров. Отметим, что в значении ${#} параметр ${0} не учитывается как позиционный. См. пример 3.

ПОЗИЦИОННЫЕ ПАРАМЕТРЫ (ПРОДОЛЖЕНИЕ)

ПРИМЕР 3:

$ cat plusx<RET>

chmod +x $1

echo "Number of files changed: ${#}"

$ ls -l file1<RET>

-rw-r--r-- 1 slf greaser 4 Dec 15 16:43 file1

$ plusx file1<RET>

$ ls -l file1<RET>

-rwxr-xr-x 1 slf greaser 4 Dec 15 16:43 file1

Number of files changed: 1

Предопределенная переменная shell ${*}

В языке shell ОС UNIX предусмотрена предопределенная переменная ${*} или $*. Ее значением является соединение (конкатенация) имен всех позиционных параметров, указанных для процедуры shell в строке команды. Если заключить выражение ${*} в двойные кавычки, то ее значение будет представлять один параметр. Например,

$ cat show.args<RET>

echo ${*}

$ show.args Each word in this sentence is an argument.<RET>

Each word in this sentence is an argument.

$

(Каждое слово в этом предложении есть параметр)

ПРЕДОПРЕДЕЛЕННАЯ
ПЕРЕМЕННАЯ SHELL
${*}

ПРИМЕР 1:

$ cat xall<RET>

chmod +x ${*}

$ ls -l file1 file2 file3<RET>

-rwxr-xr-x 1 slf greaser 4 Dec 15 16:43 file1

-rw-r--r-- 1 slf greaser 4 Dec 15 16:49 file2

-rw-r--r-- 1 slf greaser 4 Dec 15 16:49 file3

$ xall file1 file2 file3<RET>

$ ls -l file1 file2 file3<RET>

-r-xr-xr-x 1 slf greaser 4 Dec 15 16:49 file1

-rwxr-xr-x 1 slf greaser 4 Dec 15 16:49 file2

-rwxr-xr-x 1 slf greaser 4 Dec 15 16:49 file3

ПРИМЕР 2:

$ cat listit<RET>

ls -F ${*}

$ listit s*<RET>

script seepath* show.args* single* single.quotes*

Выводы и упражнения

Выводы по уроку

В этом уроке рассматривалось:

Переменная это имя, имеющее значение

Допустимы переменные только типа строка

Имена стандартных переменных shell: состоят только из заглавных букв

- PATH - список каталогов для поиска команд, имена которых Вы вводите
- EXINIT - режимы редактора vi
- HOME - имя Вашего входного каталога
- LOGNAME - Ваш пользовательский входной идентификатор
- LPDEST - имя Вашего принтера по умолчанию
- MAIL - имя пути вашего почтового файла
- MAILCHECK - частота проверки обновления почтового файла
- PS1 - первичная подсказка
- PS2 - вторичная подсказка
- TERM - тип Вашего терминала, необходим для vi и pg
- TZ - зона поясного времени в форме ESTSEDT, используется командой date.

set - команда; выводит имена и значения всех переменных текущего shell

env - команда; выводит имена и значения всех переменных среды

export - делает переменные доступными вне текущего shell

Подстановка переменных - доступ к ее значению путем помещения перед ее именем символа $

echo - команда, которая:

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

Определение Ваших собственных переменных shell:

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

Оператор присваивания: присваивает переменной значение

- обозначается знаком равенства (=), причем пробелы нельзя ставить ни справа, ни слева от этого знака
- значения, содержащие символы пробелов, нужно заключать в кавычки
- значения, содержащие специальные символы, нужно заключать в кавычки

unset - команда; удаляет значение переменной

read - команда; присваивает переменной значение

- значение читается из стандартного ввода
- подсказка НЕ выводится

подстановка команды: присваивает переменной значение

- передает результаты выполнения команды как параметры другой команде.
- присваивает переменной результат выполнения команды, как значение.
- записывается с помощью заключения команды shell в обратные апострофы

символы завершения строкового значения в операторе присваивания заканчивают это значение

Значения переменных соединяются с использованием выражений подстановки переменных и фигурных скобок { }

Позиционные параметры: передают данные процедуре shell, имеют имена от $0 по $9

- Предопределенная переменная shell ${#} имеет значение количества позиционных параметров, переданных процедуре shell.

Предопределенная переменная shell ${*} имеет значение равное соединению (конкатенации) имен всех позиционных параметров, указанных для процедуры shell в строке команды

Упражнение 6.2A

Это упражнение с карандашом и бумагой. Упражнение 6.2B требует взаимодействия с ОС UNIX.

1. Впишите букву, обозначающую соответствующее словесное определение стандартной переменной shell, слева от соответствующего имени.

___PATH a. список каталогов для поиска команд

___EXINIT b. тип Вашего терминала

___PS1 c. первичная подсказка

___TERM d. вторичная подсказка

___LPDEST e. режимы редактора vi

___PS2 f. имя Вашего принтера по умолчанию

___HOME g. имя пути Вашего почтового файла

___MAILCHECK h. частота проверки обновления почтового файла

___LOGNAME i. Ваш пользовательский входной идентификатор

___MAIL j. имя Вашего входного каталога

2. Переменные shell имеют тип _____________________

3. Верно ли заданы приведенные ниже имена переменных? Если нет, укажите, что неправильно.

abcxyz

phonenumber

TERM

1lesson

unit6.lesson2

Продолжите за терминалом упражнение 6.2.B

Упражнение 6.2B

Чтобы выполнить это упражнение, войдите в ОС UNIX. Текущим должен быть каталог unit6.

1. Выведите имена и значения всех переменных Вашего входного shell.

2. Выведите имена и значения переменных Вашей среды.

3. Создайте переменную с именем myname. Присвойте ей значение Вашей фамилии.

4. С помощью оператора echo проверьте правильность присвоения значения переменной myname.

5. Переменная myname понадобится Вам дальше, в процедурах shell. Передайте ее в Вашу среду.

6. Разработайте процедуру shell с именем name.prog, которая:

- Выводит подсказку для ввода Вашего имени;

- Читает Ваше имя;

- Выводит текст Мое имя (My name is);

- Выводит Ваши имя и фамилию в той же строке, что текст Мое имя (My name is). При этом для вывода фамилии нужно использовать переменную myname из упражнения в пункте 3.

Выполните эту процедуру, чтобы проверить правильность ее работы.

7. Присвойте переменной string1 значение ls | grep name.prog. Проверьте с помощью команды echo, что присвоено задуманное значение.

8. Присвойте переменной dinner (обед) список названий блюд, которые Вы ели за вчерашним обедом. Список должен состоять хотя бы из двух элементов. Вводите каждый элемент на отдельной строке. Вот пример (но без символов завершения строки, которые Вы должны добавить сами).

dinner=мороженое
пиво
бананы

Проверьте, что переменная
dinner имеет правильное значение.

9. Разработайте процедуру shell с именем 1variable, которая:

принимает два позиционных параметра books и books1 (имена файлов);

выводит содержимое файлов параметров с помощью команды cat, задавая ей только один параметр.

Выполните процедуру 1variable, чтобы проверить ее работу.

10. Разработайте процедуру shell с именем addx, которая:

- устанавливает всем файлам, указанным в строке команды следующие права доступа:

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

11. Измените программу addx так, что, после изменения прав доступа, выдается подробная информация ТОЛЬКО о тех файлах, имена которых передаются в командной строке. Проверьте работу addx передавая ей в качестве параметров имена файлов 1variable и name.prog.

12. Разработайте процедуру shell с именем printer, которая должна выводить на экран Вашего терминала содержимое всех файлов, имена которых указаны как параметры в командной строке ее запуска. Строки файлов должны выводиться с пустыми строками между ними, со своими номерами, без заголовков и хвостовиков. Перед каждой строкой нужно вывести 10 символов пробел. Используйте команду pr. Выполните процедуру printer для файла books.

13. Разработайте процедуру shell с именем pager, которая должна запрашивать имя файла для вывода. После этого она должна выводить на экран строки файла с пустыми строками между ними, порциями по одной странице. Используйте команду pr, связывая ее в канал с командой pg. Испытайте процедуру pager на файле books.

14. Разработайте процедуру shell с именем findfile, которая должна запрашивать имя файла для поиска. Затем она должна запросить имя каталога, с которого следует начать поиск. Затем процедура должна выполнить команду find чтобы найти этот файл, начиная с этого каталога. Напоминаем формат команды find:

find начальный_каталог -namefile -print

Попытайтесь найти файл с именем phone, начиная поиск с Вашего входного каталога.

 

Среда

Цели

1. Определить процессы, выполняемые программой входа login.
2. Описывать и создавать файл .profile.
3. Выполнять файл .profile с помощью команды "точка".
4. Устанавливать режимы терминала с помощью команды stty.
5. Назначать Вашу клавишу стирания для исправления одного символа.

Что происходит при входе в ОС UNIX

Когда Вы входите в ОС UNIX, программы login и shell автоматически создают переменные и запускают программы:

- Программа login:

1. Проверяет правильность введенных Вами значений входного идентификатора пользователя и пароля, сравнивая их с данными в файле /etc/shadow. Этот файл содержит идентификаторы и зашифрованные пароли всех зарегистрированных пользователей и другую информацию.

2. Читает имя Вашего входного каталога из файла /etc/passwd и делает этот каталог текущим.

3. Создает для Вас переменные HOME, MAIL, PATH и LOGNAME.

4. Запускает Ваш shell , который может быть одной из программ /bin/sh, /bin/ksh, /bin/csh

- Программа /usr/bin/sh:

1. Выполняет файл установки системы /etc/profile, который:

- выводит дату;

- сообщает о наличии новостей или почты;

- создает другие переменные;

- выполняет другие установочные действия, которые определены администратором ОС UNIX.

2. Выполняет Ваш собственный файл установки с именем .profile, если Вы работаете с shell программами sh или ksh, или файл .cshrc, а затем файл .login, для shell программы csh. Это делается, если такие файлы существуют в Вашем входном каталоге.

Системный файл profile и Ваш файл .profile:

И системный файл /etc/profile и Ваш файл .profile являются процедурами shell. Команды системного файла выполняются для каждого пользователя и каждый раз, когда он входит в ОС UNIX. Содержанием этого файла для всех пользователей управляет администратор системы. Вашими собственными установочными действиями Вы управляете, программируя их в файле .profile.

Этот файл выполняется после системного файла, позволяя Вам управлять окончательными установками для сеанса работы. В файле .profile содержатся команды и операторы присваивания, которые Вам нужно выполнить каждый раз при входе в ОС UNIX.

ЧТО ПРОИСХОДИТ ПРИ ВХОДЕ В ОС UNIX

1. /usr/bin/login - проверяет идентификатор пользователя и пароль, запускает /bin/sh

2. /etc/shadow - содержит пароль

3. /etc/passwd - содержит имя входного каталога

4. /usr/bin/sh - запускает /etc/profile, затем .profile для системных установок

5. /etc/profile - монтирование дисков, новости, почта, создание переменных

Пример файла .profile

Этот пример приведен на странице, справа. Ваш файл .profile должен быть в Вашем входном каталоге. Для добавления команд, переменных shell и среды, файл нужно отредактировать с помощью редактора, например vi. Файл .profile, приведенный на странице справа, выполняет следующие действия:

строка 1 Команда date выводит текущие дату и время

строки 2-5 Присваиваются значения переменным PS1, TERM, EXINIT и LPDEST. Значение переменной PS1 - это подсказка Вашего shell. В примере подсказка $ заменяется на Hi.

строки 6,8 Команды echo, которые выводят свои параметры на экран.

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

строка 9 Команда who -q (быстрый вариант команды who) выводит данные о всех пользователях, работающих в данный момент с системой.

строка 10 Команда banner выводит слова good day (добрый день) в стиле заголовка.

строка 11 Здесь экспортируются переменные TERM, EXINIT и LPDEST, после чего их могут использовать другие программы, например vi и pg.

Активизация Вашего файла .profile:

После редактирования и записи на диск (сохранения) файла .profile его нужно выполнить, чтобы произведенные в нем изменения возымели действие. Это можно сделать одним из двух способов:

Выйти из ОС UNIX и снова войти в нее, поскольку Ваш файл .profile выполняется при каждом вхождении.

Использовать имеющуюся в shell команду "точка" (.):

$ . .profile<RET>

После первого символа "точка" нужно набрать пробел.

ПРИМЕР ФАЙЛА .profile

1 date

2 PS1='Hi: '

3 TERM=610

4 EXINIT='set showmode nu'

5 LPDEST=____________

6 echo Напоминания на сегодня:

7 calendar

8 echo Сейчас системой пользуются:

9 who -q

10 banner "good day"

11 export TERM EXINIT LPDEST

АКТИВИЗАЦИЯ ВАШЕГО файла .profile

Выйти из ОС UNIX, затем войти снова,

ИЛИ

$ . .profile<RET>

$ . .profile<RET>

Tue Jan 17 10:36:33 EST 1989

Напоминания на сегодня:

Jan 18 Meeting with the boss 10:00, conference room A

(Янв 18 Встреча с начальником 10:00, комната для конференций А)

Сейчас системой пользуются:

jbm bob somers jackie slf clb

# users=6

 ####    ####    ####   #####         #####     ##     #   #
#    #  #    #  #    #  #    #        #    #   #  #     # #
#       #    #  #    #  #    #        #    #  #    #     #
#  ###  #    #  #    #  #    #        #    #  ######     #
#    #  #    #  #    #  #    #        #    #  #    #     #
 ####    ####    ####   #####         #####   #    #     #
Hi:

Вывод режимов, установленных для Вашего терминала

Режимы, установленные для терминала, необходимы для обмена сообщениями с Вашей ЭВМ. К ним относятся скорость обмена, четность, наличие эхо отображения ввода, клавиша стирания символа, символ отмены строки, установки позиций табуляции, возврат каретки.

Команда stty выводит режимы Вашего терминала. Например:

$ stty<RET>

speed 9600 baud; evenp hupcl

erase = ^h; swtch = <undef>; dsusp = <undef>;

brkint -inpck icrnl onlcr tab3

echo echoe echok

$

Режимы erase = ^h и echoe выделены в этом примере жирным шрифтом. Режим erase = ^h означает, что клавишей стирания символа является <BACKSPACE>. Если команда stty не выводит режима erase = "что-либо", то, возможно, это будет клавиша символа #. Режим echoe означает удаление стираемых символов с экрана. Если он не установлен, стираемые символы будут удалены из набираемой строки, но останутся на экране. Более подробно режимы команды stty описываются в Справочном Руководстве Пользователя (User Reference Manual).

ВЫВОД РЕЖИМОВ, УСТАНОВЛЕННЫХ
ДЛЯ ВАШЕГО ТЕРМИНАЛА

$ stty<RET>

speed 9600 baud; evenp hupcl

erase = ^h; swtch = <undef>; dsusp = <undef>;

brkint -inpck icrnl onlcr tab3

echo echoe echok

$

Установка режимов терминала с помощью команды stty

Команду stty можно использовать не только для вывода, но и для установки (разрешения) режимов терминала. Рассмотрим, как изменять эти режимы.

КЛАВИША СИМВОЛА СТИРАНИЯ

По умолчанию система клавишей символа стирания устанавливает клавишу <BACKSPACE>. Чтобы изменить ее не двухклавишную комбинацию Control-e, нужно набрать следующую строку команды:

$ stty erase '^e' echoe<RET>

Эта команда выполнит заданное изменение режимов. Если нужно использовать двухклавишные комбинации клавиши Control с другой клавишей, то перед ее символом нужно поместить символ ^ и заключить оба в одинарные кавычки, например '^e'. При указании режима echoe (echo erase - отобразить стирание), нажатие символа стирания отображается выводом на экран трех кодов символов: стирания, пробела, стирания. Это приводит к удалению ошибочного символа с экрана.

СИМВОЛ ОТМЕНЫ СТРОКИ

По умолчанию символом отмены всей ошибочной строки является символ @. Чтобы изменить его, нужно набрать следующую строку команды:

$ stty kill '^x'<RET>

После этого символом отмены строки становится комбинация Control-x, а символ @ становится обычным, теряя специальное значение. Обычно система отображает символ отмены строки, выводя символ новой строки. Если Вы хотите отменить это, добавьте к командной строке параметр -echok (echo kill - отобразить символ отмены строки). Чтобы указать управляющий символ поместите перед нужной буквой символ (^) и заключите оба символа в одинарные кавычки.

УСТАНОВКА ТАБУЛЯЦИИ

Для терминалов, не имеющих физических установок табуляции, можно использовать команду stty, для их моделирования.

$ stty tabs<RET>

После этого нажатие клавиши Tab будет приводить к выводу подходящего количества пробелов.

УСТАНОВКА РЕЖИМОВ ТЕРМИНАЛА
С ПОМОЩЬЮ КОМАНДЫ
stty

ИСПОЛЬЗУЙТЕ КОМАНДУ stty
ДЛЯ ВКЛЮЧЕНИЯ ИЛИ ВЫКЛЮЧЕНИЯ
РЕЖИМОВ ТЕРМИНАЛА

ПО УМОЛЧАНИЮ КЛАВИШЕЙ СИМВОЛА
СТИРАНИЯ ЯВЛЯЕТСЯ <BACKSPACE>

$ stty erase '^e' echoe<RET>

ПО УМОЛЧАНИЮ СИМВОЛОМ ОТМЕНЫ
ВСЕЙ ОШИБОЧНОЙ СТРОКИ ЯВЛЯЕТСЯ @

$ stty kill '^x'<RET>

УСТАНОВКА ТАБУЛЯЦИИ

$ stty -tabs<RET>

Установка режимов терминала с помощью команды stty (продолжение)

СИМВОЛ АВАРИЙНОГО ЗАВЕРШЕНИЯ (ОБЫЧНО <DELETE>)

$ stty intr '^C'<RET>

После этой команды символом аварийного завершения будет комбинация Control-c, тогда как по умолчанию это клавиша <delete>.

НАЧАЛЬНАЯ УСТАНОВКА РЕЖИМОВ ТЕРМИНАЛА

Чтобы вернуть режимам терминала их значения по умолчанию введите строку команды:

$ stty sane<RET>

Знак минус (-) перед символами обозначения режима, как правило, отключает его.

Существует большое количество режимов, задаваемых с помощью команды stty, их перечень можно найти в справочном руководстве.

УСТАНОВКА РЕЖИМОВ ТЕРМИНАЛА
С ПОМОЩЬЮ КОМАНДЫ
stty
(ПРОДОЛЖЕНИЕ)

СИМВОЛОМ АВАРИЙНОГО ЗАВЕРШЕНИЯ
ПО УМОЛЧАНИЮ ЯВЛЯЕТСЯ
КЛАВИША <DELETE>

$ stty intr '^C'<RET>

НАЧАЛЬНАЯ УСТАНОВКА
РЕЖИМОВ ТЕРМИНАЛА

$ stty sane<RET>

Выводы и упражнения

Выводы по уроку

В этом уроке описано:

Что происходит при входе в ОС UNIX

программа /usr/bin/login проверяет Ваш входной идентификатор пользователя и пароль, делает текущим Ваш входной каталог, создает переменные, запускает Вашу программу /usr/bin/sh
программа /usr/bin/sh выполняет системный файл .profile, сообщает о наличии новостей и почты, выполняет Ваш файл .profile

Системный файл .profile

- управляет входными действиями по установке Вашей среды
- активизирует Ваш файл .profile с помощью команды "точка" (.)

Режимы Вашего терминала отображаются с помощью команды stty

С помощью команды stty можно изменять режимы терминала:

- erase (клавиша стирания символа)
- kill (символ отмены строки)
- tabs (табуляция)
- interrupt (символ аварийного завершения)
- sane (установка режимов терминала, принятых по умолчанию)

Упражнение 6.3.A

1. Выведите текущие режимы Вашего терминала. Выпишите Ваши клавишу символа стирания (erase) и символ отмены всей строки (kill).

2. Установите следующие режимы терминала:

a. клавиша стирания символа - control-e

b. клавиша отмены всей строки - control-k

Выведите режимы терминала, чтобы проверить Ваши изменения.

3. Отредактируйте Ваш файл .profile так, чтобы он выполнял следующие действия:

1. Присвоение переменной LPDEST имени вашего класса printer и ее экспорт.

2. Вывод приветствия самому себе в стиле заголовка (banner).

3. Вывод даты и времени.

4. Замена Вашей первичной подсказки shell на символы Что дальше?

5. Установка клавиши <BACKSPACE> как клавиши символа стирания.

6. Вывод подсказки для чтения типа Вашего терминала, присвоение соответствующего значения переменной TERM с помощью команды read, экспорт этой переменной.

Закончив редактирование Вашего файла .profile активизируйте его с помощью . .profile.

4. Выведите режимы Вашего терминала. Какие изменения произошли в них после выполнения Вашего файла .profile

5. Выйдите из ОС UNIX и войдите снова.

6. Выведите теперь режимы Вашего терминала. Объясните как изменил их процесс входа.

7. Перенесите программу nfiles из каталога unit6 в каталог /$HOME/bin.

8. Добавьте в Ваш файл .profile строку, изменяющую значение Вашей переменной PATH так, чтобы каталог bin, подчиненный Вашему входному каталогу, вошел бы в набор каталогов, где ищутся файлы команд. Экспортируйте эту переменную. Попытайтесь выполнить программу nfiles, когда текущим является каталог, отличный от bin. Не забудьте активизировать файл .profile после редактирования.

9. Разработайте процедуру shell с именем speller в Вашем каталоге bin. Она должна запрашивать у Вас ввод имени файла, в котором нужно проверять орфографические ошибки. Затем процедура должна выводить фразу Ваши орфографические ошибки :, после чего выводить все слова с такими ошибками, найденные командой spell (классический spell ищет ошибки в английских словах). Сделайте текущим Ваш каталог unit6 и испытайте на файле paint, что выводит Ваша программа.

10.Перенесите программу pager, находящуюся в каталоге unit6 в Ваш каталог bin. Испытайте ее на любом файле по Вашему выбору, когда текущим является каталог, отличный от bin.

Буквализация метасимволов

Цели

1. Перечислить метасимволы, имеющие специальное значение в shell.
2. Использовать символ обратной косой черты (backslash) для буквализации (отмены специального значения) одного метасимвола.
3. Буквализовывать (отменять специальное значение) все метасимволы, заключенные между символами одинарных кавычек.
4. Перечислить метасимволы, сохраняющие специальное значение между символами двойных кавычек.
5. Использовать символы двойных кавычек для буквализации (отмены специального значения) заключенных в них метасимволов.
6. Применять более чем один метод буквализации внутри одной и той же командной строки.

Специальные символы (метасимволы)

Большинство символов, используемых в командах shell, обозначают сами себя. Тем не менее некоторые символы имеют для shell специальное значение. Такие символы называются метасимволами shell или специальными символами. На странице справа приведен список метасимволов shell и их специальных значений.

Как же быть, если Вы хотите использовать собственное, буквальное значение символа, а не его специальное значение? Символы буквализации отменяют специальные значения метасимволов, заставляя shell игнорировать эти значения и интерпретировать метасимволы в буквальном смысле. Существует три типа символов буквализации:

1. Символ обратной косой черты \ (backslash).

2. Одинарные кавычки.

3. Двойные кавычки.

СПЕЦИАЛЬНЫЕ СИМВОЛЫ (МЕТАСИМВОЛЫ)


Метасимвол	  Специальное значение
<пробел> <TAB> ограничители (разделяют слова, <RET> заканчивают строку команды) | транспортер ; последовательное выполнение & фоновая обработка () группировка команд {} подстановка переменной < перенаправление входного потока > перенаправление выходного потока # комментарий * [ ] ? генерация имени файла $ подстановка переменной ` подстановка команды \ отмена спец. значения следующего символа ' ' отмена спец. значения символов внутри " " отмена спец. значения символов внутри

Символ обратной косой черты (backslash)

Символ обратной косой черты (\) отменяет специальное значение следующего за ним метасимвола (буквализует его) . Появляясь в строке команды этот символ сообщает shell, что следующий символ нужно интерпретировать буквально, т.е. использовать его собственное значение. При этом shell, перед выполнением команды, удаляет из ее текста сам символ косой черты. Ниже, в примере, символ (|) - это метасимвол транспортера (связывания в канал). Он является специальным символом. Команда echo ничего не выведет на экран, пока его специальное значение не будет отменено символом обратной косой черты.

$ echo who | grep somers<RET>

$

$ echo who \| grep somers<RET>

who | grep somers

$

Для вывода самого символа обратной косой черты его нужно поместить в текст дважды.

В примере, на странице справа, перед метасимволом звездочка стоит символ обратной косой черты, предотвращая подстановку имени файла. Этот символ звездочки выводится буквально. Строка

echo Enter your name: \\c


не заключена в одинарные или двойные кавычки. Тем не менее символ неразрывности строки
\c (специальный символ для команды echo) действует. Это происходит потому, что первый символ обратной косой черты отменяет специальное значение второго, заставляя shell интерпретировать этот второй буквально. Поэтому для получения неразрывной строки можно либо использовать \\c, либо целиком заключать ее в одинарные или двойные кавычки.

СИМВОЛ ОБРАТНОЙ КОСОЙ ЧЕРТЫ (BACKSLASH)

$ cat backslash<RET>

echo This \* is an asterisk.

# Это символ звездочки

echo Files starting with s: s*

# Файлы, имена которых начинаются с буквы s

echo Enter your name: \\c

# Введите Ваше имя

read name

echo \${name} is ${name}

$ backslash<RET>

This * is an asterisk.

Files starting with s: script seepath show.args single single.quotes

Enter your name: French<RET>

${name} is French

Одинарные кавычки

Одинарные кавычки отменяют специальное значение всех заключенных между ними метасимволов; shell интерпретирует такие символы буквально. Обнаружив первую одинарную кавычку, shell игнорирует все специальные значения следующих метасимволов до обнаружения следующей одинарной кавычки. Кроме того, shell трактует все символы внутри одинарных кавычек, как одно слово. Символы одинарных кавычек удаляются shell из строки команды перед ее выполнением.

Символ обратной косой черты не имеет специального значения между одинарными кавычками. Это полезно при использовании управляющих возможностей команды echo, таких, как комбинация '\n', представляющая символ новой строки. Если эта комбинация не заключена в одинарные кавычки, shell интерпретирует символ обратной косой черты, как имеющий специальное значение и удаляет его. Оставшийся после удаления символ n, не является специальным для shell и он передает его команде echo. Запомните, что \n, \c и т.д., рассматриваются командой echo, как единственные символы. Смотрите пример 2, на странице справа.

ЗАМЕЧАНИЕ: Если Вам нужно представить литерально символы стирания или отмены строки, помещайте перед ним символ обратной косой черты, даже если они появляются между одинарными кавычками.

Знаки апострофа, используемые в таких выражениях, как what's his name, походят на кавычки, закрывающие строку. Удостоверьтесь, что Вы правильно заключаете их в кавычки.

ОДИНАРНЫЕ КАВЫЧКИ

ПРИМЕР 1:

$ echo '$PATH'<RET>

$PATH

$

ПРИМЕР 2:

$ cat single.quotes<RET>

echo This \n looks like a new line.

# Это \n только похоже на переход на новую строку

echo 'This \n is a new line.'

# А это действительно переход на новую строку

$

$ single.quotes<RET>

This n looks like a new line.

This

is a new line.

$

Двойные кавычки

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

Символ двойной кавычки (") все равно завершает заключенное в них выражение.

Символ знака доллара ($) все равно вызывает подстановку переменных.

Символ обратного апострофа (`) все равно вызывает подстановку команд.

Символ обратной косой черты (\) все равно сообщает shell, что следующий за ним символ нужно интерпретировать буквально, если это метасимвол. Символ обратной косой черты интерпретируется shell буквально, если внутри двойных кавычек он предшествует не метасимволу. Это значит , что он будет иметь специальное значение, если непосредственно предшествует символам доллара ($), обратного апострофа ('), двойной кавычки ("), или другому символу обратной косой черты. Если символ обратной косой черты имеет специальное значение между двойными кавычками, то shell удаляет его из строки команды перед ее выполнением.

И подстановка переменных и подстановка команд выполняются shell между двойными кавычками, потому, что в этом случае оба обозначающие их символа являются метасимволами. Символы двойных кавычек удаляются shell из строки команды перед ее выполнением.

Несколько методов буквализации метасимволов в одной строке команды

Вы можете использовать более чем один метод буквализации в одной строке команды. Например, если нужно задать вывод имени переменной и ее значения в одной строке команды, то нужно воспользоваться двумя методами. В примере 6, на странице справа, используются два метода, двойные кавычки и символ обратной косой черты.

В некоторых случаях любой из трех методов буквализации дает одинаковый результат. Например все методы могут подавлять переход на новую строку в команде echo.

$ echo "Enter your name: \c"<RET>

Enter your name: Mike<RET>

$ echo 'Enter your name: \c'<RET>

Enter your name: Mike<RET>

$ echo Enter your name: \\c <RET>

Enter your name: Mike<RET>

ДВОЙНЫЕ КАВЫЧКИ

ПРИМЕР 1

$ echo "${HOME}"<RET>

/home/slf

$ echo "\${HOME}"<RET>

${HOME}

ПРИМЕР 2

$ echo "This is a backslash \"<RET>

> <DEL>

$ echo "This is a backslash \ ."<RET>

This is a backslash \ .

ПРИМЕР 3

$ echo The value of TERM is ${TERM}<RET>

The value of TERM is vt100

$ echo "The value of TERM is ${TERM}"<RET>

The value of TERM is vt100

ПРИМЕР 4

$ echo The value of "*" is * <RET>

The value of * is ans backslash books books1 d days ...

$

ПРИМЕР 5

$ echo "This is your current directory: `pwd`."<RET>

This is your current directory: /home/stu2/unit6.

ПРИМЕР 6: Несколько методов буквализации в одной строке команды

$ echo "Your \${HOME} variable is set to ${HOME}"<RET>

Your ${HOME} variable is set to /home/slf

Выводы и упражнения

Выводы по уроку

В этом уроке описано:

Для того, чтобы метасимволы shell интерпретировались им буквально, они должны заключаться в кавычки.

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

Одинарные кавычки: отменяют специальные значения всех, заключенных между ними, метасимволов;

помещенные между ними символы управления выводом команды echo сохраняют свое значение;
если символы стирания и отмены строки, помещенные между одинарными кавычками, нужно интерпретировать буквально, им должен предшествовать символ обратной косой черты.

Двойные кавычки: отменяют специальные значения всех меатсимволов, исключая:

символ двойной кавычки ("), который все равно завершает заключенное в них выражение;
символ знака доллара
($), который все равно вызывает подстановку переменных;
символ обратного апострофа
(`), который все равно вызывает подстановку команд
символ обратной косой черты
(\) все равно сообщает shell, что следующий за ним символ нужно интерпретировать литерально, если это один из символов : ($), ('), (") или (\).

Упражнение 6.4.A

1. Будут ли эти строки команд выполняться, так, как это ожидается? Испытайте их на Вашем терминале, чтобы определить, почему они работают или не работают.

$ echo *** Отчет о продажах за месяц ***

$ echo ### Отчет о продажах за месяц ####

$ echo Здравствуйте Д'Артаньян

$ echo '*** Ваш терминал имеет тип $TERM ***'

$ echo цена равна $5.00

$ banner ???????

$ echo введите тип терминала (нажм. <RET> для 610)

$ echo Здравствуйте! Это программа просмотра

$ echo Правда ли, что 20 * 5 > 90?

$ echo Что есть часть?

$ echo <TAB><TAB>Здравствуйте $LOGNAME

$ name=jo press

$ grep -i $name phone

2. Каждый приведенный ниже элемент выведен с помощью команды echo. Напишите для каждого из них команду echo, которая выводит этот элемент. Все символы элемента выводите буквально, так как они представлены, за исключением символов, показанных жирным шрифтом. Этими символами напечатаны выражения подстановки переменных, вместо них должны выводиться их значения. Выполните это упражнение на Вашем терминале.

Например, пусть вывод команды echo имеет вид:

Мой пользовательский идентификатор - -это ${LOGNAME}.

Такой вывод обеспечит команда echo:

echo Мой пользовательский идентификатор - -это ${LOGNAME}

a. ${PATH}

b. Тебе
и горький хрен - малина
А мне
и бланманже - полынь

c. Символ \ часто можно применять вместо ' 'к.

d. Значение ${TERM} это ${TERM}.

(один литерал и одна подстановка переменной)

e. command=(date; who; ls a* | wc -l)

3. Разработайте процедуру shell с именем header, которая:

a. Запрашивает имя отчета, оставляя курсор на той же строке, что и запрос.

b. Читает значение этого имени и присваивает его переменной.

c. Выводит имя отчета, как заголовок, который состоит из трех звездочек, имени отчета и еще трех звездочек. Например:

***ОТЧЕТ ПЕРВЫЙ***