Определение Bash-сценария
Сценарий (скрипт) оболочки Bash представляет собой текстовый файл с набором команд, которые необходимо выполнить в определенном порядке и/или условиями. Bash-скрипт призван избавить пользователей Linux от ввода множества различных команд для решения частых задач.
Где хранить Bash-сценарии?
Перед началом написания сценария нужно определиться с местом его хранения. Системные сценарии обычно находятся в директориях /bin и /sbin, а также в /usr/bin и /usr/sbin. Для собственных сценариев рекомендую использовать каталоги /usr/local/sbin и /usr/local/bin, однако ничто вам не мешает (кроме ограничения прав записи) хранить свои сценарии в любых других не системных каталогах.
Если вы решили использовать, какой-либо нестандартный каталог, то не забудьте добавить его в переменную среды $PATH, чтобы вы могли запускать свои сценарии по имени, без указания полного пути.
Изменять переменную $PATH следует в файле ~/.bash_profile, если его нет то в ~/.profile.
Например, если я хочу хранить сценарии в каталоге ~/oleg/bash_scripts, то мне необходимо написать следующую строку.
PATH="$PATH:~/oleg/bash_scripts"
Так при инициализации работы оболочки ваш каталог уже будет добавлен в переменную $PATH.
Как создать и выполнить Bash-сценарий?
Для примера, в каталоге /usr/local/sbin, создадим скрипт say_hi.sh, который будет выводить в консоли текстовую строку "Hello Universe!".
touch /usr/local/sbin/say_hi.shДалее откроем этот файл любым текстовым редактором, например Vim.
vim /usr/local/sbin/say_hi.shИ укажем в нем следующие строки.
|
1 2 |
#!/bin/bash echo "Hellow Universe!" |
Здесь первая строка является комментарием где указывается путь до интерпретатора, который будет выполнять скрипт.
Если не указать интерпретатор вручную, то будет использоваться интерпретатор по умолчанию, чаще всего это оболочка /bin/sh.
Во второй строке указана команда вывода echo и ее аргумент "Hello Universe!".
Чтобы скрипт мог быть выполнен к нему необходимо добавить бит исполнения файла.
chmod +x /usr/local/sbin/say_hi.shТеперь можно просто указать имя скрипта и запустить его.
say_hi.shВ результате увидим следующее.
meliorem@ubuntu:~$ say_hi.sh
Hello Universe!
Скрипт можно также передать самой оболочке в качестве аргумента . В этом случае делать скрипт исполняемым не обязательно.
bash say_hi.sh
Ввод и вывод данных в Bash
Вывод текстовой информации можно осуществлять с помощью команд echo и printf.
Разница между ними лишь в том, что echo не позволяет форматировать текст (без добавления ключа -e) и делает автоматический перенос строки в отличии от printf.
Различия команд представлены ниже.
|
1 2 3 |
#!/bin/bash echo "\tHello there! \u263b\n" printf "\tHello there! \u263b\n" |
meliorem@ubuntu:~$ say_hi.sh
\tHello there! \u263b\n
Hello there! ☻
meliorem@ubuntu:~$
Ввод данных осуществляется с помощью команды - read. Результат ввода необходимо сохранять в переменную.
|
1 2 3 4 |
#!/bin/bash echo -n "Введите ваше имя: " read user_name echo "Добрый день, $user_name!" |
meliorem@ubuntu:~$ Введите ваше имя: Oleg
Добрый день, Oleg!
meliorem@ubuntu:~$
Комментарии в Bash
Комментарии предназначены для описания того, что происходит в скрипте на отдельных его участках, чтобы сам создатель скрипта и другие пользователи могли быстрее разобраться в тонкостях его работы.
Комментарии полностью игнорируются интерпретатором (кроме первой строки).
Однострочным комментарием будет считаться одна или несколько строк в начале которых стоит символ - #.
|
1 2 3 4 5 |
#!/bin/bash echo -n "Введите ваше имя: " # Просим пользователя ввести своё имя. read user_name echo "Добрый день, $user_name!" |
В Bash также доступны многострочные комментарии, которые начинаются с символа - : и находятся внутри двойных или одинарных кавычек.
Не забудьте оставить пробел между : и первой кавычкой.
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash : " Данный скрипт принимает два числа в качестве аргументов и выводит результат их суммы. " ((sum=$1+$2)) echo $sum exit |
Еще один вариант составления многострочного комментария.
|
1 2 3 4 5 6 7 8 |
#!/bin/bash echo -n "Введите ваше имя: " <<bigcomment Просим пользователя ввести своё имя. bigcomment read user_name echo "Добрый день, $user_name!" |
Отладка Bash-скриптов
В Bash поддерживается отладка скриптов и проверка синтаксиса.
Используйте команду bash c ключом -x для запуска скрипта в режиме отладки.
bash -x script.shТакже есть возможность передать ключ в самом скрипте.
|
1 2 3 4 |
#!/bin/bash -x echo “Ждать 5 секунд” sleep 5 echo “Выполнено!” |
Отладку также можно производить выборочно для отдельных участков кода. В этом поможет настройка параметров оболочки с помощью команды set.
Чтобы начать отладку определенного участка кода, вставьте строку с set -x в начало участка и set +x в его конец.
С помощью команды set можно включать и выключать определенные параметры оболочки. Ознакомится со списком параметров можно после ввода команды set -o.
set -x/set +x- начать/закончить отладку.set -v- выводить строки ввода по мере их чтения.set -n- проверка синтаксиса, без выполнения самого кода.set -o [параметр]/set +o [параметр]- включение/выключение параметра.
В следующем примере команда создания каталога не будет выполнена, также в консоли появится сообщение об ошибке синтаксиса.
|
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # Включаем параметр проверки синтаксиса set -o noexec if [someerror] mkdir project echo "Создан новый каталог." # Выключаем параметр проверки синтаксиса set +o noexec # Другой код далее... |
Особенности написания Bash-скриптов
- В первой строке всегда указывается интерпретатор, который будет выполнять скрипт.
Помимо Bash вы также можете использовать другие интерпретаторы, например#!/bin/sh,#!/usr/bin/perl,#!/usr/bin/pythonи другие.
Чтобы узнать путь к интерпретатору используйте командуwhich, напримерwhich python. - Так как расширение файла не играет в Linux особой роли то приписывать
.shсовсем не обязательно.
Это делается для удобства самого пользователя. - Слишком длинные команды вы можете разбить на несколько строк с помощью символа -
\. - Вне зависимости того в какой оболочке вы находитесь, будь это
zsh,cshили любая другая, скрипт будет выполнять та оболочка, путь к которой указан в первой строке.