[[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"