Введение в Bash

Bash (акроним от "Bourne-again SHell", что может переводится как «перерожденный шел», Борн - создатель sh) - это командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне, который читать команды из файла, который называется скриптом или сценарием. В его обязанности входит обработка и исполнение команд, с помощью которых пользователь управляет компьютером.
В этой статье мы ознакомимся с основами написания скриптов на bash для самых разнообразных целей: для упрощения рутинных задач и автоматизации постоянно повторяющихся действий, для запуска нескольких команд единовременно, или одной команды с трудными и обширными аргументами.

Требования

  • сервер с Ubuntu 16.04
  • Пользователь с sudo-правами

Настройка папки

Перед тем, как приступить к написанию скрипта на bash, рекомендуется создать для него отдельную папку, например, ~/bin.
Для создания папки введите в консоль следующую команду:
mkdir ~/bin
Откройте на редактирование /etc/profile, выполнив команду:
nano /etc/profile
Добавьте следующие строки в конец файла:
PATH=$PATH:$HOME/binexport PATH
Для сохранения внесенных изменений нажмите сочетание клавиш  CTRL+O, для выхода - сочетание клавиш CTRL+X.

Создание файла

Для того чтобы запустить скрипт нужно создать исполняемый файл. Введите последовательно команды:
touch ~/bin/firstscript
chmod +x ~/bin/firstscript
, где firstscript - название исполняемого файла
Откройте текстовый редактор, чтобы заполнить исполняемый файл:
nano ~/bin/firstscript
Любой bash-скрипт должен начинаться со строки: #!/bin/bash
В этой строке после #! указывается путь к bash-интерпретатору, поэтому если он установлен в другом месте (где именно, можно узнать, введя команду whereis bash), необходимо поменять путь.
Комментарии начинаются с символа # (кроме первой строки).
Заполните исполняемый файл firstscript следующими строками:
#!/bin/bash

clearecho “Hello World!”
Сохраните внесенные изменения, нажав сочетание клавиш CTRL+X.
Запустите скрипт командой, которая является именем исполняемого файла:
firstscript
Результат должен выглядеть следующим образом:
Hello World!

Пример скрипта резервного копирования

Для создания bash-скрипта резервного копирования введите команды:
touch ~/bin/filebackup
chmod +x ~/bin/filebackup
nano ~/bin/filebackup
Скрипт для запуска резервного копирования состоит из следующих строк:
#!/bin/bash#Backup script#Копирование любого заданного файла в папку backupBACKUPFOLDER=~/backup#Установка переменной в папку Backup, для записи в которую есть соответствующие праваmkdir -p $BACKUPFOLDER#Убеждаемся, что папка для записи существуетcp -a $@ $BACKUPFOLDER

#Данный скрипт будет копировать заданный файл в папку
 
После сохранения внесенных изменений можно протестировать свой скрипт, перейдя в любую папку в системе с несколькими файлами и запустив команду:
filebackup math.sh
Можно добавить сколько угодно файлов к этой последовательности, и все они будут скопированы в папку резервного копирования backup.
Введем команду и перейдем в папку резервного копирования:
cd $BACKUPFOLDER
Для просмотра файлов в папке введем команду:
ls
В результате должно отобразиться следующее:
math.sh

Основные команды для написания bash скрипта

Существует ряд встроенных команд, которые используются для создания скриптов:
  • break - выход из цикла for, while или until
  • continue - выполнение следующей итерации цикла for, while или until
  • echo - вывод аргументов, разделенных пробелами, на стандартное устройство вывода
  • exit - выход из оболочки
  • export - отмечает аргументы как переменные для передачи в дочерние процессы в среде
  • hash - запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
  • kill - посылает сигнал завершения процессу
  • pwd - выводит текущий рабочий каталог
  • read - читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
  • return - заставляет функцию оболочки выйти с указанным значением
  • shift - перемещает позиционные параметры налево
  • test - вычисляет условное выражение
  • times - выводит имя пользователя и системное время, использованное оболочкой и ее потомками
  • trap - указывает команды, которые должны выполняться при получении оболочкой сигнала
  • unset - вызывает уничтожение переменных оболочки
  • wait - ждет выхода из дочернего процесса и сообщает выходное состояние

Работа с переменными

Самый распространенный способ хранения начальных данных — переменные. В самом начале программы объявляются несколько таких переменных, в которые пользователь записывает некоторые исходные данные.
Список зарезервированных переменных:
$DIRSTACK - содержимое вершины стека каталогов
$EDITOR - текстовый редактор по умолчанию
$EUID - эффективный UID, если используется программа su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя
$UID - реальный идентификатор, который устанавливается только при логине
$FUNCNAME - имя текущей функции в скрипте
$GROUPS - массив групп к которым принадлежит текущий пользователь
$HOME - домашний каталог пользователя
$HOSTNAME - ваш hostname
$HOSTTYPE - архитектура машины
$LC_CTYPE - внутренняя переменная, которая определяет кодировку символов
$OLDPWD - прежний рабочий каталог
$OSTYPE - тип ОС
$PATH - путь поиска программ
$PPID - идентификатор родительского процесса
$SECONDS - время работы скрипта(в сек.)
$# - общее количество параметров переданных скрипту
$* - все аргументы, переданные скрипту (выводятся в строку)
$@ - все аргументы, переданные скрипту (выводятся в столбик)
$! - PID последнего запущенного в фоне процесса
$$ - PID самого скрипта

Пример работы с переменными и конфигурационным файлом

#!/bin/bashEMAIL=example@gmail.com

#Вписать адрес электронной почтыecho "Адрес электронной почты: $EMAIL"
Такой способ хорош, если данных мало и скрипт рассчитан на автоматическое выполнение без участия пользователя.
Необходимо ясно известить пользователя о том, что и где ему необходимо вписать. Желательно собрать все это в одном месте — файле конфигурации. Подключить его можно командой source. Например, если конфигурационный файл будет лежать в той же директории, что и скрипт, мы получим:
#!/bin/bashsource ./config.cfg
echo "Адрес электронной почты: $EMAIL"
В файл config.cfg не забудем поместить строчку: ЕMAIL=example@gmail.com

Пример работы с математическими операциями

Для работы с математическими операциями используется команда let, которая производит арифметические операции над числами и переменными.
Содержимое исполняемого файла:
#!/bin/bashecho "Введите a: "
read a
echo "Введите b: "
read b
let "c = a + b" #сложение
echo "a+b= $c"
let "c = a / b" #деление
echo "a/b= $c"
 
Обновите название исполняемого файла, нажав сочетание клавиш CTRL+O, например, пусть он будет называться math, после чего нажмите клавишу Enter.
Сделайте файл исполняемым:
chmod +x math
Запустите файл:
math
Результат выполнения должен выглядеть следующим образом:
Введите a:
123
Введите b:
12
a+b= 135
a/b= 10
 
Список математических операций:
+ — сложение
— — вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль (деление по модулю), остаток от деления
 
Команда let позволяет использовать сокращения арифметических команд, тем самым сокращая количество используемых переменных, например: a = a+b эквивалентно a +=b.

Параметры скрипта

Еще один способ сообщить данные программе — указать при запуске в командной строке. Содержатся эти параметры в переменных с номерами.
Например: $0 — имя скрипта, $1 — первый параметр, $2 — второй параметр и т. д. Также существуют две вспомогательные переменные: $# содержит количество переданных аргументов; $@содержит все аргументы, переданные скрипту, разделенные пробелами.

Цикл for-in

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
Синтаксис следующий:
for переменная in список_значений
do
команды
done

Пример работы цикла for-in с параметрами

#!/bin/bash# Цикл выдаст все переданные аргументыfor n in $@do  echo "$n"done
 Для тестирования скрипта введи команду, введя перед названием исполняемого файла оператор  bash, а в качестве параметров - one two four:
bash parametr one two four
В результате получим следующее:
one
two
four

Цикл while

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно (код возврата = 0).
Синтаксис оператора следующий:
while выражение или команда возвращающая код возврата
do
команды
done

Пример работы с циклом until-do

В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно:
#!/bin/bashecho "Введите числитель: "
read dividend
echo "Введите знаменатель: "
read divisor
dnd=$dividend #мы будем изменять переменные dividend и divisor
#сохраним их знания в других переменных, т.к. они нам понадобятся
dvs=$divisor
remainder=1
until [ "$remainder" -eq 0 ]
do
let "remainder = dividend % divisor"
dividend=$divisor
divisor=$remainder
done
echo "НОД чисел $dnd и $dvs = $dividend"
 
Результат выполнения скрипта:
Введите числитель:
100
Введите знаменатель:
90
НОД чисел 100 и 90 = 10

Условные операторы

Условный оператор используется для выполнения определенных действий, если условие является истинным или ложным. Это выполняется с помощью команды “If”. Синтаксис оператора следующий:
if ls folder
then
echo "Folder exists"
fi

Пример работы с условными операторами if-else

Введите последовательно команды:
touch ~/bin/fileifelse
chmod +x ~/bin/fileifelse
nano ~/bin/fileifelse
Заполните исполняемый файл fileifelse:
#!/bin/bashecho -e "Введите название папки:"read BACKUPFOLDER#Проверка того, что папка существуетif [ -d $BACKUPFOLDER ]then  echo "Папка существует и будет использована."else  mkdir $BACKUPFOLDER  if [ -d $BACKUPFOLDER ]  then    echo "Папка успешно создана."  else    echo -e "У меня нет прав, чтобы создать папку резервного копирования.\ \nВыход."    exit 1#Exit 1 - это команда, которая выходит из сценария с кодом ошибки  fifi#Запрос файлов для резервного копирования:echo -e "Какие файлы следует отправить в папку резервного копирования?"read FILESif [ -n $FILES ]then  cp -a $FILES $BACKUPFOLDERelse  echo "Файл не существует"fi
Результат работы скрипта fileifelse:
Введите название папки:
backup2
Папка существует и будет использована.
Какие файлы следует отправить в папку резервного копирования?
math.sh
Проверка наличия файлов в папке по команде ls backup2:
math.sh

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0