Добавить в цитаты Настройки чтения

Страница 86 из 113

[[email protected]/* */ ~]$ vim ~/bin/sys_info_page

А затем введите следующую программу:

#!/bin/bash

# Программа вывода страницы с информацией о системе

echo "<HTML>"

echo "  <HEAD>"

echo "         <TITLE>Page Title</TITLE>"

echo "  </HEAD>"

echo "  <BODY>"

echo "         Page body."

echo "  </BODY>"

echo "</HTML>"

Наша первая версия содержит строку-шебанг (shebang), комментарий (можно только приветствовать) и последовательность команд echo, по одной для вывода каждой строки. После сохранения файла сделайте его выполняемым и попробуйте запустить:

[[email protected]/* */ ~]$ chmod 755 ~/bin/sys_info_page

[[email protected]/* */ ~]$ sys_info_page

После запуска на экране должен появиться текст HTML-документа, потому что команды echo в сценарии посылают свои строки в стандартный вывод. Запустите программу снова и перенаправьте вывод программы в файл sys_info_page.html, чтобы затем посмотреть результат в веб-браузере:

[[email protected]/* */ ~]$ sys_info_page > sys_info_page.html

[[email protected]/* */ ~]$ firefox sys_info_page.html

Пока все идет неплохо.

Разрабатывая программы, всегда следует помнить о простоте и ясности. Сопровождение дается проще, когда программа легко читается и доступна для понимания, не говоря уже о том, что программу легче писать, когда есть возможность уменьшить объем ручного ввода. Текущая версия программы работает замечательно, но ее можно упростить. Если объединить все команды echo в одну, это определенно упростит в будущем добавление новых строк в вывод программы. Поэтому изменим программу, как показано ниже:

#!/bin/bash

# Программа вывода страницы с информацией о системе

echo "<HTML>

        <HEAD>

                <TITLE>Page Title</TITLE>

        </HEAD>

        <BODY>

                Page body.

        </BODY>

</HTML>"

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

[[email protected]/* */ ~]$ echo "<HTML>

>         <HEAD>

>                 <TITLE>Page Title</TITLE>

>         </HEAD>

>         <BODY>

>                 Page body.

>         </BODY>

> </HTML>"

Символ > в начале каждой строки — это приглашение к вводу командной оболочки, определяемое ее переменной PS2. Оно появляется всякий раз, когда происходит ввод многострочной инструкции. Эта особенность пока мало понятна, но потом, когда мы познакомимся с многострочными программными инструкциями, ее преимущества станут очевидными.

Этап второй: добавление некоторых данных

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

#!/bin/bash

# Программа вывода страницы с информацией о системе

echo "<HTML>

        <HEAD>

                <TITLE>System Information Report</TITLE>

        </HEAD>

        <BODY>



                <H1>System Information Report</H1>

        </BODY>

</HTML>"

Здесь добавлено название страницы и заголовок в теле отчета.

Переменные и константы

В нашем сценарии возникла проблема. Обратили внимание, что строка System Information Report повторяется дважды? Вообще, для такого крохотного сценария это не такая большая проблема, но представьте по-настоящему длинный сценарий, в котором эта строка повторяется много раз. Если в таком сценарии понадобится изменить название, придется внести изменения во множестве мест, а это масса ручной работы. Можно ли изменить сценарий так, чтобы строка определялась в нем только один раз? Это существенно упростило бы сопровождение сценария в будущем. Да, это возможно, например, так:

#!/bin/bash

# Программа вывода страницы с информацией о системе

title="System Information Report"

echo "<HTML>

        <HEAD>

                <TITLE>$title</TITLE>

        </HEAD>

        <BODY>

                <H1>$title</H1>

        </BODY>

</HTML>"

Создав переменную с именем title и присвоив ей значение System Information Report, мы воспользовались преимуществами подстановки параметров и поместили строку во множество мест.

Создание переменных и констант

Но как создать переменную? Просто, — достаточно использовать ее. Когда командная оболочка встречает переменную, она автоматически создает ее. Этим она отличается от многих языков программирования, в которых переменные должны явно объявляться или определяться до ее использования. Командная оболочка слишком либеральна в этом отношении, что в итоге приводит к некоторым проблемам.

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

[[email protected]/* */ ~]$ foo="yes"

[[email protected]/* */ ~]$ echo $foo

yes

[[email protected]/* */ ~]$ echo $fool

[[email protected]/* */ ~]$

Мы сначала присвоили значение yes переменной foo и затем вывели ее значение командой echo. Далее, мы попробовали вновь вывести значение переменной, но допустили опечатку, указав имя fool, и получили пустую строку. Такой результат объясняется тем, что командная оболочка благополучно создала переменную fool, встретив ее, и присвоила ей пустое значение по умолчанию. Из этого примера следует, что нужно внимательно следить за правописанием! Также важно понять, что в действительности произошло в этом примере. Из предыдущего знакомства с особенностями работы механизма подстановки мы знаем, что ­команда

[[email protected]/* */ ~]$ echo $foo

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

[[email protected]/* */ ~]$ echo yes

С другой стороны, команда

[[email protected]/* */ ~]$ echo $fool

превращается в

[[email protected]/* */ ~]$ echo

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

[[email protected]/* */ ~]$ foo=foo.txt

[[email protected]/* */ ~]$ foo1=foo1.txt

[[email protected]/* */ ~]$ cp $foo $fool

cp: после 'foo.txt' пропущен операнд, задающий целевой файл

По команде "cp --help" можно получить дополнительную информацию.

Мы присвоили значения двум переменным, foo и foo1. А затем попытались выполнить команду cp, но допустили опечатку в имени второго аргумента. После обработки механизмом подстановки команда cp получила только один аргумент, хотя требует двух.

Ниже приводятся несколько правил именования переменных:

• Имена переменных могут состоять из алфавитно-цифровых символов (букв и цифр) и символов подчеркивания.

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

• Присутствие пробелов и знаков препинания в именах переменных не допускается.

ПРИМЕЧАНИЕ

В действительности командная оболочка имеет механизм, гарантирующий неизменяемость констант, в виде встроенной команды declare с параметром -r (read-only — только для чтения). Если переменной TITLE присвоить значение, как показано ниже:

declare -r TITLE="Page Title"