Определение 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
или любая другая, скрипт будет выполнять та оболочка, путь к которой указан в первой строке.