Перевод книги http://tldp.org/LDP/Bash-Beginners-Guide/html/Bash-Beginners-Guide.html
Пока-что переведено лишь самое важное из первой главы. Остальное будет позже.

1.5.1 Свойства хороших скриптов

Вот несколько общих рекомендаций по написанию хороших bash скриптов:

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

1.5.2. Структура bash скрипта

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

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

  • Потребуется ли какая-то информация от пользователя или пользовательского окружения?
  • Как будет храниться информация?
  • Надо ли будет создавать какие-нибудь файлы? Где и с какими правами доступа?
  • Какие команды будут использованы в скрипте? Если скрипт будет использоваться на других системах, будут ли там доступны эти команды в нужной версии?
  • Нужно ли выводить пользователю информацию? Когда и какую?

1.5.4. Слово о порядке и логике

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

Существует несколько методик, одна из наиболее часто используемых – работа со списками. Перечислите в списке все функции программы.

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

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

1. Вы хотите автоматически архивировать логи?
   1. Если да:
      1. Введите имя директории в которой хранятся логи
      2. Введите имя основного лога
      3. Введите количество дней, сколько будут храниться логи
      4. Сделать запись в пользовательском crontab.
   2. Если нет, перейти к шагу 3
2. Хотите обработать еще набор логов?
   1. Если да, перейти к шагу 1
   2. Если нет, перейти к шагу 3
3. Выход

В нашем примере пользователь должен предоставить программе определенную информацию. Введенную пользователем информацию необходимо сохранить. Пользователь должен быть проинформирован что его crontab будет изменен.

1.5.5. Пример bash скрипта

boffin:~> cat -n mysystem.sh
     1  #!/bin/bash
     2  clear
     3  echo "This is information provided by mysystem.sh.  Program starts now."
     4
     5  echo "Hello, $USER"
     6  echo
     7
     8  echo "Today's date is `date`, this is week `date +"%V"`."
     9  echo
    10
    11  echo "These users are currently connected:"
    12  w | cut -d " " -f 1 - | grep -v USER | sort -u
    13  echo
    14
    15  echo "This is `uname -s` running on a `uname -m` processor."
    16  echo
    17
    18  echo "This is the uptime information:"
    19  uptime
    20  echo
    21
    22  echo "That's all folks!"

Скрипт всегда начинается с двух одинаковых символов – «#!». После них указывается какой шелл будет выполнять команды скрипта. Скрипт начинается с того, что в строке 2 он очищает экран. Строка 3 выводит на экран информацию о том, что будет дальше происходить. Строка 5 выводит приветствие пользователю. Строки 6, 9, 13, 16 и 20 предназначены для того, что б выводить пустые строки между между логическими разделами выводимой информации. Строка 8 выводит текущюю дату и номер недели. Строки 3, 11, 18 и 22 – выводят текст, указывающий на тип информации который будет выводиться следом за ними. Строка 12 преобразует и выводит на экран результат выполнения команды «w». Строка 15 показывает информацию о системе и процессоре. Строка 19 выводит время работы системы и нагрузку на нее.

Для вывода информации на экран в Bash оболочке могут быть использованы команды echo и printf. Обе они являются встроенными командами оболочки Bash. Команда echo всегда возвращает код выполнения 0 и просто выводит информацию на экран и переводит курсор на новую строчку. Команда printf позволяет указать формат вывода информации на экран и возвращает не-нулевой код ответа в случае ошибки.

Тот же самый скрипт, выводящий информацию с помощью printf:


This is the same script using the printf built-in:

tom:~> cat mysystem.sh
#!/bin/bash
clear
printf "This is information provided by mysystem.sh.  Program starts now.\n"

printf "Hello, $USER.\n\n"

printf "Today's date is `date`, this is week `date +"%V"`.\n\n"

printf "These users are currently connected:\n"
w | cut -d " " -f 1 - | grep -v USER | sort -u
printf "\n"

printf "This is `uname -s` running on a `uname -m` processor.\n\n"

printf "This is the uptime information:\n"
uptime
printf "\n"

printf "That's all folks!\n"

1.5.6. Пример init скрипта

Init скрипты запускают сервисы на Unix и Linux машинах. Демон системного лога, демон управления питанием, сервер имен и почтовый сервер – это все примеры сервисов, которые запускаются init скриптами. Эти скрипты также называются стартовыми скрипами, хранятся они в стандартных директориях, таких как /etc/rc.d/init.d или /etc/init.d. Init – это первичный процесс (имеет pid 1, он читает свой конфигурационный файл и принимает решение какие сервисы запускать или останавливать на каждом уровне работы системы. Уровни – это набор конфигураций процессов, у каждой системы есть уровень одного пользователя, к примеру, для административной работы, при которой система должна быть запущена с наименьшим использованием ресурсов, такой как восстановление критичной файловой системы из бэкапа. Обычно уровни для перезагрузки и выключения системы тоже сконфигурированы.

Все задачи которые необходимо выполнить при старте или выключении сервиса описаны в стартовом скрипте. Одной из задач системного администратора является конфигурирование init, для своевременных запуска и остановки сервисов. Если вы столкнулись с подобной задачей, вам необходимо хорошее понимание процедур запуска и остановки вашей системы. Рекомендуется ознакомится с мануалами по init и inittab перед началом создания собственных init скриптов.

Вот пример простого скрипта, который будет воспроизводить звук при старте и завершении работы ситсемы:


#!/bin/bash
# This script is for /etc/rc.d/init.d
# Link in rc3.d/S99audio-greeting and rc0.d/K01audio-greeting

case "$1" in
'start')
  cat /usr/share/audio/at_your_service.au > /dev/audio
  ;;
'stop')
  cat /usr/share/audio/oh_no_not_again.au > /dev/audio
  ;;
esac
exit 0

Оставить комментарий