KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Мендель Купер - Искусство программирования на языке сценариев командной оболочки

Мендель Купер - Искусство программирования на языке сценариев командной оболочки

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Мендель Купер, "Искусство программирования на языке сценариев командной оболочки" бесплатно, без регистрации.
Перейти на страницу:

 # но через год-другой будет очень тяжело вспомнить -- что она делает.

 # (Из сценария "pw.sh", автор: Antek Sawicki)


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

#!/bin/bash


#************************************************#

# xyz.sh #

# автор: Bozo Bozeman #

# Июль 05, 2001 #

# #

# Удаление файлов проекта. #

#************************************************#


BADDIR=65 # Нет такого каталога.

projectdir=/home/bozo/projects # Каталог проекта.


# ------------------------------------------------------- #

# cleanup_pfiles () #

# Удаляет все файлы в заданном каталоге. #

# Параметры: $target_directory #

# Возвращаемое значение: 0 -- в случае успеха, #

# $BADDIR -- в случае ошибки. #

# ------------------------------------------------------- #

cleanup_pfiles ()

{

if [ ! -d "$1" ] # Проверка существования заданного каталога.

then

echo "$1 -- не является каталогом."

return $BADDIR

fi


rm -f "$1"/*

return 0 # Успешное завершение функции.

}


cleanup_pfiles $projectdir


exit 0

Не забывайте начинать ваш сценарий с sha-bang -- #!/bin/bash.

 Заменяйте повторяющиеся значения константами. Это сделает ваш сценарий более простым для понимания и позволит вносить изменения, не опасаясь за его работоспособность.

 if [ -f /var/log/messages ]

 then

 ...

 fi

 # Представьте себе, что через пару лет

 # вы захотите изменить /var/log/messages на /var/log/syslog.

 # Тогда вам придется отыскать все строки,

 # содержащие /var/log/messages, и заменить их на /var/log/syslog.

 # И проверить несколько раз -- не пропустили ли что-нибудь.

 # Использование "констант" дает лучший способ:

 LOGFILE=/var/log/messages # Если и придется изменить, то только в этой строке.

 if [ -f "$LOGFILE" ]

 then

 ...

 fi


 В качестве имен переменных и функций выбирайте осмысленные названия.

 fl=`ls -al $dirname` # Не очень удачное имя переменной.

 file_listing=`ls -al $dirname` # Уже лучше.

 MAXVAL=10 # Пишите имена констант в верхнем регистре.

 while [ "$index" -le "$MAXVAL" ]

 ...

 E_NOTFOUND=75 # Имена кодов ошибок -- в верхнем регистре,

 # к тому же, их желательно дополнять префиксом "E_".

 if [ ! -e "$filename" ]

 then

 echo "Файл $filename не найден."

 exit $E_NOTFOUND

 fi

 MAIL_DIRECTORY=/var/spool/mail/bozo # Имена переменных окружения

 # так же желательно записывать символами

 # в верхнем регистре.

 export MAIL_DIRECTORY

 GetAnswer () # Смешивание символов верхнего и нижнего решистров

 # удобно использовать для имен функций.

 {

 prompt=$1

 echo -n $prompt

 read answer

 return $answer

 }

 GetAnswer "Ваше любимое число? "

 favorite_number=$?

 echo $favorite_number

 _uservariable=23 # Допустимо, но не рекомендуется.

 # Желательно, чтобы пользовательские переменные не начинались с символа подчеркивания.

 # Так обычно начинаются системные переменные.


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

 E_WRONG_ARGS=65

 ...

 ...

 exit $E_WRONG_ARGS

См. так же Приложение C.

 Разделяйте большие сложные сценарии на серию более коротких и простых модулей. Пользуйтесь функциями. См. Пример 34-4.

 Не пользуйтесь сложными конструкциями, если их можно заменить простыми.

 COMMAND

 if [ $? -eq 0 ]

 ...

 # Избыточно и неинтуитивно.

 if COMMAND

 ...

 # Более понятно и коротко.


... читая исходные тексты сценариев на Bourne shell (/bin/sh). Я был потрясен тем, насколько непонятно и загадочно могут выглядеть очень простые алгоритмы из-за неправильного оформления кода. Я не раз спрашивал себя: "Неужели кто-то может гордиться таким кодом?"

Landon Noll


Глава 33. Разное

Практически никто не знает грамматики Bourne shell-а. Даже изучение исходных текстов не дает ее полного понимания.

Tom Duff


33.1. Интерактивный и неинтерактивный режим работы

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

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

#!/bin/bash

MY_PROMPT='$ '

while :

do

echo -n "$MY_PROMPT"

read line

eval "$line"

done


exit 0


# Этот сценарий, как иллюстрация к вышесказанному, предоставлен

# Stephane Chazelas (спасибо).


Будем считать интерактивным такой сценарий, который может принимать ввод от пользователя, обычно с помощью команды read (см. Пример 11-2). В "реальной жизни" все намного сложнее. Пока же, будем придерживаться предположения о том, что интерактивный сценарий ограничен рамками tty, с которого сценарий был запущен пользователемa, т.е консоль или окно xterm.

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

Неинтерактивные сценарии прекрасно могут работать в фоне, в то время, как интерактивные -- подвисают, останавливаясь на операциях, ожидающих ввода пользователя. Сложности, возникающие с запуском интерактивных сценариев в фоновом режиме, могут быть преодолены с помощью expect-сценария или встроенного документа. В простейших случаях, можно организовать перенаправление ввода из файла в команду read (read variable <file). Эти приемы позволят создавать сценарии, которые смогут работать как в интерактивном, так и в неинтерактивном режимах.

Если внутри сценария необходимо проверить режим работы -- интерактивный или неинтерактивный, это можно сделать проверкой переменной окружения $PS1.

if [ -z $PS1 ] # интерактивный режим?

then

# неинтерактивный

...

else

# интерактивный

...

fi

Еще один способ -- проверка установки флага "i" в переменной $-.

case $- in

*i*) # интерактивный режим

;;

*) # неинтерактивный режим

;;

# (Из "UNIX F.A.Q.," 1993)


Сценарий может принудительно запускаться в интерактивном режиме, для этого необходимо указать ключ -i в строке-заголовке #!/bin/bash -i. Однако вы должны помнить о том, что в таких случаях сценарий может выдавать сообщения об ошибках даже тогда, когда ошибок, по сути, нет.


33.2. Сценарии-обертки

"Обертки" -- это сценарии, которые содержат один или несколько вызовов системных команд или утилит, с длинным списком параметров. Такой прием освобождает пользователя от необходимости вводить вручную сложные и длинные команды из командной строки. Он особенно полезен при работе с sed и awk.

Сценарии sed или awk, как правило вызываются в форме: sed -e 'commands' или awk 'commands'. "Заворачивая" такие вызовы в сценарий на языке командной оболочки, мы делаем их использование более простым для конечного пользователя. Кроме того, этот прием позволяет комбинировать вызовы sed и awk, например в конвейере, позволяя передавать данные с выхода одной утилиты на вход другой.

Пример 33-1. сценарий-обертка

#!/bin/bash


# Этот простой сценарий удаляет пустые строки из текстового файла.

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

#

# Однако вы можете дополнить сценарий такой проверкой,

# добавив нечто подобное:

# if [ -z "$1" ]

# then

# echo "Порядок использования: `basename $0` текстовый_файл"

# exit 65

# fi


# Для выполнения этих же действий,

# из командной строки можно набрать

# sed -e '/^$/d' filename


sed -e /^$/d "$1"

# '-e' -- означает команду "editing" (правка), за которой следуют необязательные параметры.

# '^' -- с начала строки, '$' -- до ее конца.

# Что соответствует строкам, которые не содержат символов между началом и концом строки,

#+ т.е. -- пустым строкам.

# 'd' -- команда "delete" (удалить).


# Использование кавычек дает возможность

#+ обрабатывать файлы, чьи имена содержат пробелы.


exit 0

Пример 33-2. Более сложный пример сценария-обертки

#!/bin/bash


# "subst", Сценарий замены по шаблону

# т.е., "subst Smith Jones letter.txt".

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*