Искусство программирования на языке сценариев командной оболочки
Шрифт:
Записывайте сценарии в структурированной форме, это облегчит их последующую реорганизацию и оптимизацию. Помните, что значительная часть методов оптимизации кода, существующих в языках высокого уровня, вполне применима и к сценариям, однако есть и такие, которые не могут применяться. Основной критерий здесь -- это здравый смысл.
Прекрасный пример того, как оптимизация может сократить время работы сценария, вы найдете в Пример 12-32.
33.7. Разные советы
Для
# Добавление (>>) учетной записи, об использовании сценария, в файл отчета.
date>> $SAVE_FILE # Дата и время.
echo $0>> $SAVE_FILE # Название сценария.
echo>> $SAVE_FILE # Пустая строка -- как разделитель записей.
# Не забудьте определить переменную окружения SAVE_FILE в ~/.bashrc
# (что нибудь, типа: ~/.scripts-run)
Оператор >> производит добавление строки в конец файла. А как быть, если надо добавить строку в начало существующего файла?
file=data.txt
title="***Это титульная строка в текстовом файле***"
echo $title | cat - $file >$file.new
# "cat -" объединяет stdout с содержимым $file.
# В результате получится
#+ новый файл $file.new, в начало которого добавлена строка $title.
Само собой разумеется, то же самое можно сделать с помощью sed.
Сценарий командной оболочки может использоваться как команда внутри другого сценария командной оболочки, Tcl, или wish сценария или, даже в Makefile. Он может быть вызван как внешняя команда из программы на языке C, с помощью функции system, т.е. system("script_name");.
Собирайте свои библиотеки часто используемых функций и определений. Эти "библиотеки" могут быть "подключены" к сценариям, с помощью команды точка (.) или source.
# Сценарий-библиотека
# ------ -------
# Обратите внимание:
# Здесь нет sha-bang ("#!").
# И нет "живого кода".
# Определения переменных
ROOT_UID=0 # UID root-а, 0.
E_NOTROOT=101 # Ошибка -- "обычный пользователь".
MAXRETVAL=255 # Максимальное значение, которое могут возвращать функции.
SUCCESS=0
FAILURE=-1
# Функции
Usage # Сообщение "Порядок использования:".
{
if [ -z "$1" ] # Нет аргументов.
then
msg=filename
else
msg=$@
fi
echo "Порядок
}
Check_if_root # Проверка прав пользователя.
{ # из примера "ex39.sh".
if [ "$UID" -ne "$ROOT_UID" ]
then
echo "Этот сценарий должен запускаться с привилегиями root."
exit $E_NOTROOT
fi
}
CreateTempfileName # Создание "уникального" имени для временного файла.
{ # Из примера "ex51.sh".
prefix=temp
suffix=`eval date +%s`
Tempfilename=$prefix.$suffix
}
isalpha2 # Проверка, состоит ли строка только из алфавитных символов.
{ # Из примера "isalpha.sh".
[ $# -eq 1 ] || return $FAILURE
case $1 in
*[!a-zA-Z]*|"") return $FAILURE;;
*) return $SUCCESS;;
esac # Спасибо S.C.
}
abs # Абсолютное значение.
{ # Внимание: Максимально возможное возвращаеиое значение
# не может превышать 255.
E_ARGERR=-999999
if [ -z "$1" ] # Проверка наличия входного аргумента.
then
return $E_ARGERR # Код ошибки, обычно возвращаемый в таких случаях.
fi
if [ "$1" -ge 0 ] # Если не отрицательное,
then #
absval=$1 # оставить как есть.
else # Иначе,
let "absval = (( 0 - $1 ))" # изменить знак.
fi
return $absval
}
tolower # Преобразование строк символов в нижний регистр
{
if [ -z "$1" ] # Если нет входного аргумента,
then #+ выдать сообщение об ошибке
echo "(null)"
return #+ и выйти из функции.
fi
echo "$@" | tr A-Z a-z
# Преобразовать все входные аргументы ($@).
return
# Для записи результата работы функции в переменную, используйте операцию подстановки команды.
# Например:
# oldvar="A seT of miXed-caSe LEtTerS"
# newvar=`tolower "$oldvar"`
# echo "$newvar" # a set of mixed-case letters
#
# Упражнение: Добавьте в эту библиотеку функцию перевода символов в верхний регистр.
# toupper [это довольно просто].
}
Для повышения ясности комментариев, выделяйте их особым образом.
## Внимание!
rm -rf *.zzy ## Комбинация ключей "-rf", в команде "rm", чрезвычайно опасна,
##+ особенно при удалении по шаблону.
#+ Продолжение комментария на новой строке.