Современные решения ИТ задач и программной инженерии

Пишем на bash интуитивно-понятный сценарий

04.07.2015 в разделе Администрированиес тегами sshscriptingbashfreebsdnix
Пишем на bash интуитивно-понятный сценарий
Абсолютно все системные администраторы рано или поздно сталкиваются с bash скриптами. Bash скрипты очень полезны в повседневной работе. Они существенно упрощают рутинную работу. Но речь сегодня пойдет не об этом а о способе передачи данных скрипту.

Иногда в bash скрипт нужно передать некоторые данные. Число или тестовую строку для дальнейшей обработки логики и действий. Очень удобно передавать данные через командную строку, но когда у вас таких скриптов больше десятка, начинается забавная ситуация по изучению содержимого bash скрипта перед запуском. На это все тратиться время, немного но тратиться. Давайте рассмотрим вариант, шаблон скрипта, который принимает все необходимые данные через командную строку а если данные не указаны то скрипт запрашивает их сразу после запуска.

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

Параметры по умолчанию в подсказках так же играют свою большую роль при выполнении bash скрипта. Представьте ситуацию, что после запуска bash скрипта, скрипт запрашивает у вас данные на ввод а вы не знаете что ему в ответ написать. Представили? Да, нужно будет прервать принудительно выполнение скрипта и сидеть вспоминать код. Или еще хуже, изучать чей то код или курить документацию. Так давайте попытаемся сделать все грамотно. Да, бывают ситуации когда запрос ввода данных очень не кстати в bash скриптах, но это обычно бывает в очень маленьких скриптах и мы сейчас не об этом. Итак, приступим.

#!/bin/sh

if [ "$1" = "" ]; then
  printf "Delete all files (yes/no)? [no]: "
  read choose
else
  choose="$1"
fi

if [ "$choose" = "yes" ]; then
  printf "Mode 1n"
else
  printf "Mode 2n"
fi

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

$1 - это первый параметр командной строки. Если скрипт был запущен без параметров то переменная $1 будет пустая. Если она пустая, выводим сообщение "Delete all files (yes/no)? [no]: " и запрашиваем у пользователя ввести значение для переменной choose. Кстати да, там в конце строки сообщения не баг а явный пробел, для красивого вывода. Иначе, если переменная $1 не пустая, присваиваем ее значение переменной choose, то есть то что было передано через командную строку.

Далее по сценарию мы смотрим на содержимое переменной choose и если оно равно yes то выполняем какое то действие 1, иначе, выполняем действие 2 или можем ничего не выполнять (по надобности). В нашем случае мы просто печатаем текст в консоль, без никаких удалений файлов, в зависимости от содержимого переменной choose.

Итак, чем же этот шаблон bash скрипта хорош? Да всем, смотрите, вы можете запустить этот скрипт из командной строки передав ему первый параметр как yes или no. Вы можете запустить этот скрипт без параметров, он запросит у вас ввод данных, вы можете ввести ему yes или no, по мере выполнения скрипта. А теперь внимание! Вы можете запустить этот скрипт без параметров, он запросит у вас ввод данных и вы ничего не введете, или введете какой то бред и нажмете на клавишу Enter и bash скрипт продолжит работу с параметром по умолчанию no!

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

Пишите хорошо и цените свой и чужой труд.