Простые Bash-скрипты как исполняемые файлы со списком команд
Bash ‒ это не только среда для выполнения команд, также язык программирования. Написанные на Bash программы, или скрипты, помещают в файлы, которые делают исполняемыми, после чего передают интерпретатору Bash (просто запускают в командной оболочке).
Несмотря на то, что в языке Bash имеются условия, циклы и функции, он является достаточно простым, сложных сценариев на нем не пишут. Если же такая необходимость возникает, делают выбор в пользу Python, Си или других языков.
Bash-скрипты в основном используются для автоматизации задач администрирования ОС и в простейшем случае представляют собой обычный список команд, которые будут исполняться одна за другой при выполнении содержащего их файла. Представьте, что вам надо запускать пару, а то и несколько, команд подряд, и эту комбинацию вы повторяете изо дня в день. Вместо того чтобы прокручивать историю или вводить заново, проще сохранить список команд в файл.
Файл можно подготовить в текстовом редакторе или в совсем простых случаях создать с помощью команд cat
или echo
. Текстовый редактор (не путайте с приложениями для набора и оформления текста для чтения на естественном языке) может быть любым, в том числе с графическим интерфейсом пользователя. Однако существуют и консольные, которые запускаются непосредственно в терминале. Такими являются, например, Nano (команда nano
) и Vim (Базовые операции в Vim).
Обычно первой строкой в командных скриптах записывается путь до программы bash. Его предваряют шебангом (#!
):
#!/bin/bash
или
#!/usr/bin/bash
Однако скрипт может работать и без этого, если запускать его из командной оболочки.
Разделителем команд в Bash-скрипте являются либо переход на новую строку, либо точка с запятой. Кстати, использовать точку с запятой можно и в командной оболочке, когда несколько команд дается в одной строке.
Запишем с помощью программы cat
в файл пару команд:

То, что мы вводим с клавиатуры и видим на экране, отправляется в файл today. С помощью второго вызова cat
убеждаемся, что файл содержит необходимые команды.
Если сейчас в командной строке написать одно название файла, Bash сообщит, что команда не найдена. Действительно, выполнять можно только исполняемые файлы, то есть такие, в правах которых установлен атрибут 'x'. Однако это не мешает передать файл в качестве аргумента программе bash
, то есть командной оболочке.

При этом, из текущего процесса bash, будут запущен еще один процесс bash. И хотя он завершится после выполнения команд из today, если мы не хотим порождать лишние процессы, файл today следует сделать исполняемым. После этого его можно выполнять как обычную команду.

Мы указываем каталог, где находится наш исполняемый файл потому, что Bash не знает о его существовании. Командная оболочка просматривает только определенные каталоги на предмет наличия в них исполняемых программ. Список таких каталогов содержится в переменной PATH.

Каталоги разделяются двоеточием. Как видно на скрине в списке в данном случае домашнего каталога нет. Мы могли бы переместить наш файл в один из указанных каталогов или добавить в переменную PATH наш каталог. Однако бывает проще и безопаснее оставить все как есть, и просто дописывать перед командным файлом адрес.
Пример создания файла с помощью команды echo
:

В приведенном выше примере просматриваемый каталог задается программно. Однако скорее всего мы захотели бы использовать подобный скрипт по отношению к разным каталогам. Их можно передавать при вызове программы. В Bash-скрипте они будут присвоены специальным переменным-параметрам. Так первый аргумент после имени скрипта присваивается переменной $1. Тогда наша программа на языке Bash будет выглядеть так:
#!/usr/bin/bash date echo -n "Каталог: " ls -d $1 ls -l $1
А ее вызовы так:
$ ./test.sh /home/pl/Android/
$ ./test.sh Загрузки
Если не указать каталог, то будет выведено содержимое текущего.
Более практичный пример ‒ использовать Bash-скрипт для git-репозитория. Допустим, перед каждым коммитом изменения добавляются в проект (команда git add .
), потом выполняется коммит (git commit -m "пояснение внесенных изменений"
), в конце делается пуш изменений на сервер (git push
). Назовем скрипт fastgit.sh:
#!/usr/bin/bash git add . git commit -m "$1" git push
Добавим права на исполнение:
$ chmod +x fastgit.sh
Пример вызова:
$ ./fastgit.sh "Добавлен файл style_media.css"