Введение в Bash
Bash (акроним от "Bourne-again SHell", что может переводится как «перерожденный шел», Борн - создатель sh) - это командный процессор, работающий, как правило, в интерактивном режиме в текстовом окне, который читать команды из файла, который называется скриптом или сценарием. В его обязанности входит обработка и исполнение команд, с помощью которых пользователь управляет компьютером.
В этой статье мы ознакомимся с основами написания скриптов на bash для самых разнообразных целей: для упрощения рутинных задач и автоматизации постоянно повторяющихся действий, для запуска нескольких команд единовременно, или одной команды с трудными и обширными аргументами.
Для создания папки введите в консоль следующую команду:
mkdir ~/bin
Откройте на редактирование /etc/profile, выполнив команду:
nano /etc/profile
Добавьте следующие строки в конец файла:
touch ~/bin/firstscript
chmod +x ~/bin/firstscript
, где firstscript - название исполняемого файла
Откройте текстовый редактор, чтобы заполнить исполняемый файл:
nano ~/bin/firstscript
Любой bash-скрипт должен начинаться со строки: #!/bin/bash
В этой строке после #! указывается путь к bash-интерпретатору, поэтому если он установлен в другом месте (где именно, можно узнать, введя команду whereis bash), необходимо поменять путь.
Комментарии начинаются с символа # (кроме первой строки).
Заполните исполняемый файл firstscript следующими строками:
Запустите скрипт командой, которая является именем исполняемого файла:
firstscript
Результат должен выглядеть следующим образом:
Hello World!
touch ~/bin/filebackup
chmod +x ~/bin/filebackup
nano ~/bin/filebackup
Скрипт для запуска резервного копирования состоит из следующих строк:
После сохранения внесенных изменений можно протестировать свой скрипт, перейдя в любую папку в системе с несколькими файлами и запустив команду:
filebackup math.sh
Можно добавить сколько угодно файлов к этой последовательности, и все они будут скопированы в папку резервного копирования backup.
Введем команду и перейдем в папку резервного копирования:
cd $BACKUPFOLDER
Для просмотра файлов в папке введем команду:
ls
В результате должно отобразиться следующее:
math.sh
Список зарезервированных переменных:
$DIRSTACK - содержимое вершины стека каталогов
$EDITOR - текстовый редактор по умолчанию
$EUID - эффективный UID, если используется программа su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя
$UID - реальный идентификатор, который устанавливается только при логине
$FUNCNAME - имя текущей функции в скрипте
$GROUPS - массив групп к которым принадлежит текущий пользователь
$HOME - домашний каталог пользователя
$HOSTNAME - ваш hostname
$HOSTTYPE - архитектура машины
$LC_CTYPE - внутренняя переменная, которая определяет кодировку символов
$OLDPWD - прежний рабочий каталог
$OSTYPE - тип ОС
$PATH - путь поиска программ
$PPID - идентификатор родительского процесса
$SECONDS - время работы скрипта(в сек.)
$# - общее количество параметров переданных скрипту
$* - все аргументы, переданные скрипту (выводятся в строку)
$@ - все аргументы, переданные скрипту (выводятся в столбик)
$! - PID последнего запущенного в фоне процесса
$$ - PID самого скрипта
Необходимо ясно известить пользователя о том, что и где ему необходимо вписать. Желательно собрать все это в одном месте — файле конфигурации. Подключить его можно командой source. Например, если конфигурационный файл будет лежать в той же директории, что и скрипт, мы получим:
Содержимое исполняемого файла:
Обновите название исполняемого файла, нажав сочетание клавиш 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 список_значений
do
команды
done
bash parametr one two four
В результате получим следующее:
one
two
four
Синтаксис оператора следующий:
while выражение или команда возвращающая код возврата
do
команды
done
Результат выполнения скрипта:
Введите числитель:
100
Введите знаменатель:
90
НОД чисел 100 и 90 = 10
if ls folder
then
echo "Folder exists"
fi
touch ~/bin/fileifelse
chmod +x ~/bin/fileifelse
nano ~/bin/fileifelse
Заполните исполняемый файл fileifelse:
Введите название папки:
backup2
Папка существует и будет использована.
Какие файлы следует отправить в папку резервного копирования?
math.sh
Проверка наличия файлов в папке по команде ls backup2:
math.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