#!/bin/bash для чайников:))

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

Итак, что же такое shell-скрипты и как их поставить себе на вооружение?

Shell — это командная оболочка. Но еще это и мощный язык программирования. Программы на языке shell называют сценариями, или скриптами. Для использования в скриптах доступен полный набор команд, утилит и программ UNIX и плюс внутренние команды shell — условные операторы, операторы циклов и пр., которые увеличивают мощь и гибкость сценариев.

Структуру скрипта можно описать в семи словах следующим образом: «вызов командного интерпретатора — тело скрипта — завершение скрипта». Пишутся скрипты с помощью любого текстового редактора, сохраняются они как текстовые файлы. Но, чтобы было удобнее, я сохраняю их с расширением «*.sh». Но давайте посмотрим на все это на примере конкретной задачи.

Итак, постановка задачи. Есть приложение, которое требуется запускать с довольно большим набором параметров. Запускать придется часто, а каждый раз вводить эти параметры лень:)) Чтоб было нагляднее, посмотрим, как выглядит это действие:

/home/Admin/soft/sgconf/sgconf -s 10.10.10.1 -p 5555 -a Admin -w 112233 -u user -c 100

Что же делает эта команда? Вкратце опишу ситуацию. Есть сервер, раздающий интернет пользователям. Пользователи сидят в инете по цене n рублей за мегабайт. Когда средства на балансе заканчиваются, юзеры приносят деньги, администратор начисляет их им на баланс и пользователи могут снова сидеть в инете за n руб/метр. Сервер находится по адресу 10.10.10.1, порт сервера — 5555, администратора зовут Admin, его пароль — 112233. Требуется на пользователя user положить 100 рублей. Первые 4 параметра — адрес и порт сервера, логин и пароль администратора будут неизменными, а последние два — имя юзера и сумма платежа буду каждый раз разными. Соответственно, нам нет нужды каждый раз вводить 4 неизменных параметра, можно жестко прописать их в теле скрипта, а последние 2 — у нас будут переменными.

Приступим непосредственно к написанию скрипта.

Что же должен делать скрипт? Считывать две переменные(назовем их «user» и «cash»), подставлять их в параметры запуска и запускать приложение. В принципе, все, но так как разработчиками приложения не были предусмотрены некоторые полезные функции, мы можем сами добавить их. Например, мне было бы очень удобно, если бы у меня велся лог пополнений баланса.

Открываем текстовый редактор и пишем код.

Первым делом нам нужен вызов интерпретатора. Для данного скрипта будем использовать интерпретатор bash.

#!/bin/bash

Далее добавим небольшое описание того, что требуется сделать пользователю. Вывод текста осуществляется командой echo. Параметром данной команды является сам текст, который нужно вывести. Пользователь вводит значение переменной, которую считывает оператор read. Параметром этой команды является имя переменной, значение которой задает пользователь. Выглядит это так:

echo -------- sgconf.sh v 0.1 --------

echo Имя пользователя:

	read user

echo Сумма платежа:

	read cash

echo ---------------------------------

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

/home/Admin/soft/sgconf/sgconf -s 10.10.10.1 -p 5555 -a Admin -w 112233 -u $user -c $cash

Обратите внимание, что вызов переменной обозначается знаком «$», т.е если имя переменной указано со знаком $, то мы обращаемся к ее значению.

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

Логи у нас будут лежать в виде файла sgconf.log, находящимся в удобной для нас папке. Что нужно для ведения нормальных логов? Во-первых — отметка о выполненной операции, во-вторых — время, когда эта операция была выполнена. Наша операция — это платеж, проведенный на имя пользователя. То есть запись будет иметь следующий формат:

Баланс пользователя “$user” пополнен на “$cash” рублей в $time

И если с переменными $user и $cash мы уже разобрались, то откуда берется значение переменной time?

В консоли линукса есть очень полезный оператор, который показывает нам точное время. Вот это точное время мы и будем использовать в качестве значения переменной time. Делается это просто:

time=`date`

То есть переменная определяется как результат, возвращаемый оператором date.

Теперь разберемся с записью файла sgconf.log. Если он уже существует, то в конце добавим новую запись, если нет — то создадим его и внесем туда данные о нашей операции.

Текст, который будем вносить в логи будет таким:

text="Баланс пользователя "$user" пополнен на "$cash" рублей в $time"

Переменная text меняется в зависимости от переменных user, cash и time

if [ -e /home/Admin/scripts/sgconf/sgconf.log ]

	then echo $text >> /home/Admin/scripts/sgconf/sgconf.log 

	else echo $text > /home/Admin/scripts/sgconf/sgconf.log

fi

Проверка условия производится с помощью конструкции if — then — else — fi. Если выполняется условие, заданное в квадратных скобках, то выполняем один код, если это условие не выполняется — другой, затем заканчиваем проверку.

Конструкция [ -e /home/Admin/scripts/sgconf/sgconf.log ]
– это проверка существования файла /home/Admin/scripts/sgconf/sgconf.log, об этом говорит операция -e: если файл существует, она возвращает значение true и выполняется код echo $text >> /home/Admin/scripts/sgconf/sgconf.log. Если он не существует — то код echo $text > /home/Admin/scripts/sgconf/sgconf.log В первом случае мы добавляем значение переменной text в конец файла(это делается с помощью символа « >> »), во втором случае — мы записываем значение text в новый файл(« > »).

Все, теперь завершаем наш скрипт командой exit.
Сохраняем код в любое удобное место под именем «sgconf.sh» и пользуемся.

Полный код скрипта выглядит так:

#!bin/bash

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

#                  sgconf.sh                     #

#           autor: Sergey Kondrashov             #

#                 10 25, 2009                    #

#                                                #

#    how to use sgconfig without hemorrhoids     #

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


echo -------- sgconf.sh v 0.1 --------

echo Имя пользователя:

	read user

echo Сумма платежа:

	read cash

echo ---------------------------------

/home/Admin/soft/sgconf/sgconf -s 10.10.10.1 -p 5555 -a Admin -w 112233 -u $user -c $cash

time=`date`

text="Баланс пользователя "$user" пополнен на "$cash" рублей в $time"

echo $text

if [ -e /home/Admin/scripts/sgconf/sgconf.log ]

	then echo $text >> /home/Admin/scripts/sgconf/sgconf.log 

	else echo $text > /home/Admin/scripts/sgconf/sgconf.log

fi

exit 

Теперь, когда нам нужно положить кому-нибудь денежку, мы запускаем скрипт командой «sh sgconf.sh», вводим имя плательщика и сумму платежа. Никаких длинных строчек, никакой головной боли с постоянным вводом одних и тех же значений.

Но на этом я не остановился. Мне показалось неудобным то, что функционал программы предусматривает гораздо больше операций, нежели просто пополнение баланса. Коды этих операций передаются программе так же с помощью параметров. А используя приведенный выше способ, мне пришлось бы писать отдельный скрипт под каждую операцию, что было бы не слишком удобно. Выход очевиден: запуск скрипта с параметрами, которые будут переданы программе. Делается это еще проще, чем то, что мы сделали раньше.

За считывание параметров запуска отвечает переменная “@”. То есть, если мы запускаем скрипт с параметрами, они будут сохранены в эту переменную:

sh sgconf.sh -u user -c 100

Теперь мы просто подставим значение этой переменной в команду, выполняемую скриптом:

/home/Admin/soft/sgconf/sgconf -s 10.10.10.1 -p 5555 -a Admin -w 112233 "$@"

Все! Согласитесь, это куда более удобно, чем то, что было раньше.

Дальше нам нужно подправить ведение логов. Для этого просто редактируем переменную text:

text="$@" "$time"

Таким образом, мы сможем в логах видеть не только имя плательщика, и сумму денег, внесенную им, но и код операции, будь то платеж или кредит и т.д.

Полный код второй версии скрипта выглядит так:

#!bin/bash

#************************************************#
#                  sgconf.sh                     #
#           autor: Sergey Kondrashov             #
#                 10 25, 2009                    #
#                                                #
#    how to use sgconfig without hemorrhoids     #
#************************************************#

echo sgconf.sh v 0.2
/home/Admin/soft/sgconf/sgconf -s 10.10.10.1 -p 5555 -a Admin -w 112233 "$@"
time=`date`
text="$@" "$time"
echo $text
if [ -e /home/onion/scripts/sgconf/sgconf.log ]
	then echo $text >> /home/onion/scripts/sgconf/sgconf.log 
	else echo $text > /home/onion/scripts/sgconf/sgconf.log
fi
exit

9 Comments

  1. я наверное чегото не понимаю.. а команды read $user и read $cash всегда будут считывать только значение, которое вводится прямо перед их выполнением? скажем, если код будет иметь вот такой вид:
    echo Имя пользователя:
    echo Сумма платежа:
    read user
    read cash

    как система поймёт, что user это имя, а cash это сумма?
    или в таком случае надо добавлять чтото типа
    $user=Имя пользователя
    $cash=Сумма платежа

    1. read считывет стандартный ввод. Сначала вводим имя пользователя. затем – сумму пополнения.
      Поэтому мы сначала выводим эхо – описание, а потом предлагаем пользователю ввести данные.

Leave a Reply