Bash (Bourne Again Shell) – это программа-оболочка, которая предоставляет пользователям среду для ввода команд и запуска других приложений. Когда вы открываете терминал в большинстве дистрибутивов Linux, вы по умолчанию используете оболочку Bash.
Пользователи могут вводить команды в интерфейсе командной строки (CLI) Bash для навигации по файлам, управления процессами, установки программного обеспечения и выполнения практически любых операций, которые поддерживают ОС.
Преимущества сценариев Bash
IT-специалисты широко используют Bash для выполнения широкого спектра задач, в том числе:
- Выполнение команд. Интерфейс командной строки Bash позволяет пользователям управлять запущенными процессами, перемещаться по файловой системе, запускать приложения и управлять файлами и каталогами.
- Сценарии. Программисты пишут сценарии Bash и выполняют последовательности команд для автоматизации рабочих процессов и создания новых инструментов и функций.
- Обработка данных. Bash поддерживает использование пайп (|) для передачи вывода одной команды в другую, позволяя последовательно применять цепочку операций к данным. Например, специалисты по обработке данных и аналитики могут использовать пайпы Bash для быстрой обработки данных.
- Настройка среды. Файлы конфигурации (.bashrc и .bash_profile) позволяют пользователям настраивать среду Bash, псевдонимы, переменные среды и запросы.
- Планирование задач. Скрипты Bash можно запланировать для запуска в определенное время или через определенные промежутки времени. Например, администраторы баз данных используют Bash для планирования резервного копирования или оптимизации БД.
- Программирование и разработка. Разработчики используют Bash для компиляции и запуска программного обеспечения, управления зависимостями проекта или автоматизации рабочих процессов разработки.
- Системное администрирование. Системные администраторы используют Bash для настройки служб, мониторинга ресурсов, развертывания приложений и выполнения соответствующих задач по управлению системой.
- Сеть. Сетевые администраторы используют команды Bash ssh и netstat, чтобы облегчить передачу данных и удаленное управление системой.
- Интерактивные рабочие процессы. Bash может запрашивать у пользователей ввод данных – это очень удобно для создания управляемых рабочих процессов. Например, специалисты службы поддержки могут разрабатывать управляемые рабочие процессы для устранения распространенных проблем вместо того, чтобы лично проводить конечного пользователя через весь процесс.
Основные команды Bash
Вот список некоторых из наиболее часто используемых команд в среде Bash:
Команда | Значение |
---|---|
cd | Изменяет текущий каталог на другой. |
ls | Выводит список содержимого текущего каталога. |
mkdir | Создает новый каталог. |
touch | Создает новый файл. |
rm | Удаляет файл или каталог. |
cp | Копирует файл или каталог. |
mv | Перемещает или переименовывает файл или каталог. |
echo | Выводит текст в терминал. |
cat | Конкатенирует и выводит содержимое файла. |
grep | Ищет шаблон в файле. |
chmod | Изменяет права доступа к файлу или каталогу. |
sudo | Запускает команду с административными привилегиями. |
df | Отображает доступное дисковое пространство. |
history | Показывает список ранее выполненных команд. |
ps | Отображает информацию о работающих процессах. |
а так-же
break | выход из цикла for, while или until |
continue | выполнение следующей итерации цикла for, while или until |
echo | вывод аргументов, разделенных пробелами, на стандартное устройство вывода |
exit | выход из оболочки |
export | отмечает аргументы как переменные для передачи в дочерние процессы в среде |
hash | запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении |
kill | посылает сигнал завершения процессу |
pwd | выводит текущий рабочий каталог |
read | читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным |
return | заставляет функцию оболочки выйти с указанным значением |
shift |
перемещает позиционные параметры налево |
test | вычисляет условное выражение |
times | выводит имя пользователя и системное время, использованное оболочкой и ее потомками |
trap | указывает команды, которые должны выполняться при получении оболочкой сигнала |
unset | вызывает уничтожение переменных оболочки |
wait | ждет выхода из дочернего процесса и сообщает выходное состояние. |
Синтаксис Bash-скриптов
Bash-скрипты – это текстовые файлы, которые можно создать в любом текстовом редакторе.
Важно! Эти скрипты обязательно должны иметь права на выполнение.
Давайте рассмотрим некоторые из наиболее популярных текстовых редакторов, которые помогут вам при создании Bash-скриптов:
- Nano. Простой текстовый редактор, который включен в большинство дистрибутивов Linux. Он отличается простым и интуитивно понятным интерфейсом, а также имеет дополнительные полезные функции – например, подсветку синтаксиса.
- Vim. Это одним из самых популярных текстовых редакторов для Linux. Он предлагает множество функций, которые ускоряют процесс написания кода – подсветку синтаксиса, автодополнение и макросы. Однако некоторым начинающим пользователям он может показаться сложным.
- Emacs. Еще один популярный текстовый редактор для Linux. Emacs также обладает множеством функций, которые значительно упрощают процесс написания кода. Одной из его главных особенностей является возможность запуска интерпретатора Bash прямо внутри редактора, что упрощает тестирование скриптов без выхода из него.
Каждый Bash-скрипт должен начинаться со строки, называемой «шебанг», которая указывает операционной системе, какой интерпретатор следует использовать для выполнения скрипта.
Шебанг начинается с символа решетки (#), за которым следует восклицательный знак (!), а затем указывается путь к интерпретатору.
Например, для использования интерпретатора Bash пропишите:
1 |
#!/bin/bash |
Вы также можете добавлять комментарии к своим скриптам, начиная строку с символа решетки. Комментарии предоставляют описание функциональности скрипта и не выполняются интерпретатором.
Например:
1 |
# Это мой комментарий |
Как запустить Bash-скрипт
Для запуска Bash-скрипта в операционной системе Linux вам нужно предоставить ему разрешение на выполнение. Это можно сделать с помощью команды «chmod». Она позволяет изменять права доступа к файлам и директориям в системе.
Синтаксис команды «chmod
» выглядит следующим образом:
chmod опции права_доступа файл
Где:
- «опции» – дополнительные параметры, которые можно указать для команды «chmod».
- «права_доступа» – специальный код, который определяет права доступа к файлу или директории.
- «файл» – путь к файлу или директории, права доступа к которой вы хотите изменить.
Чтобы сделать файл исполняемым, вам нужно добавить бит исполнения («x») к правам доступа к файлу.
Например, давайте предположим, что у нас есть файл с именем «sweb.sh», и мы хотим сделать его исполняемым. Мы можем использовать следующую команду:
1 |
chmod +x sweb.sh |
Эта команда добавит бит исполнения для текущего пользователя.
Теперь, чтобы выполнить Bash-скрипт в Linux, вы можете вызвать его из терминала, указав путь к скрипту:
1 |
./sweb.sh |
Результат выполнения скрипта будет отображен в терминале.
Параметры командной строки
Параметры командной строки предоставляют возможность передавать аргументы скрипту Linux при его выполнении.
Эти аргументы могут быть обращены внутри скрипта через специальные переменные: $1, $2, $3…, где $1 – это первый параметр, $2 – второй и так далее.
Давайте напишем простой скрипт:
1 2 |
#!/bin/bash echo «Hello, $1!» |
Теперь запустим скрипт, передав ему аргумент, в данном случае, имя пользователя (параметр $USER):
1 |
./hello.sh $USER |
Результат выполнения скрипта будет отображен в терминале.
Встроенные параметры
Кроме того, вам доступны и другие специальные переменные командной строки:
$DIRSTACK | содержимое вершины стека каталогов |
$EDITOR | текстовый редактор по умолчанию |
$EUID | Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как… |
$UID | …содержит реальный идентификатор, который устанавливается только при логине. |
$FUNCNAME | имя текущей функции в скрипте. |
$GROUPS | массив групп к которым принадлежит текущий пользователь |
$HOME | домашний каталог пользователя |
$HOSTNAME | ваш hostname |
$HOSTTYPE | архитектура машины. |
$LC_CTYPE | внутренняя переменная, котороя определяет кодировку символов |
$OLDPWD | прежний рабочий каталог |
$OSTYPE | тип ОС |
$PATH | путь поиска программ |
$PPID | идентификатор родительского процесса |
$SECONDS | время работы скрипта(в сек.) |
$# | общее количество параметров переданных скрипту |
$* | все аргументы переданыне скрипту(выводятся в строку) |
$@ | тоже самое, что и предыдущий, но параметры выводятся в столбик |
$! | PID последнего запущенного в фоне процесса |
$$ | PID самого скрипта |
Например, чтобы вывести на экран количество переданных параметров, можно использовать следующий код:
1 2 3 |
#!/bin/bash echo "Hello, $1!" echo "Количество переданных параметров: $#" |
Переменные
Переменные в сценариях на Bash служат для хранения таких данных, как текстовые строки и числа. Они могут быть заданы явно, когда вы назначаете им конкретное значение, или скрытно, когда они автоматически получают значение при выполнении определенных операций.
Для создания переменной в Bash необходимо использовать оператор присваивания (=).
Например:
1 |
host=«Spaceweb» |
Чтобы получить значение переменной, используйте ее имя с символом доллара ($), после команды «echo». Например:
1 |
echo $host |
Также вы можете присваивать значения переменным, считывая их с клавиатуры с помощью команды «read».
Переменные не имеют типа (число, строка, массив и так далее) и действуют, как нужно в данный момент: как строка, команда, число, несколько чисел и так далее. Они могут даже интерпретироваться как несколько ключевых слов, если в вашей «строке» есть пробелы.
Например, следующий сценарий запрашивает у пользователя ввод имени и сохраняет его в переменной:
1 2 3 4 |
#!/bin/bash echo "Ваше имя" read name echo "Привет, $name! " |
или
1 2 3 4 |
#!/bin/bash echo "Please enter your name" read username echo "Hello, $username! Welcome to the Bash world." |
Область видимости
Понимание области видимости крайне важно, чтобы избежать ошибок.
Возможности которыми недостаточно пользуются, — это использование переменных local
и readonly
. local
ограничивает переменную функцией, в которой она определена, а readonly вызовет ошибку, если вы попытаетесь переопределить переменную. Вы даже можете использовать эти опции вместе и сделать локальную переменную только для чтения.
Имя глобальной переменной должно быть ЗАГЛАВНЫМИ буквами. Чтобы сделать переменную доступной для всего терминала, используйте export VAR=»value
».
Верхний регистр говорит о том, что это глобальная переменная, а не о том, что это константа/неизменяемая переменная, как в других языках.
Локальные переменные — это обычные переменные внутри одного сценария. Они не доступны другим программам и сценариям, которые запускаются с этой оболочки. Объявляются переменные с помощью символа =
(обратите внимание на то, что перед и после =
нет пробелов), а к их значениям обращаются с помощью символа $
:
name="Петро Петрович"
echo $name # вывод значения
unset name # вывод переменной
акже можно создать локальную переменную внутри функции, которая будет доступна только в теле этой функции:
local локальная_переменная=значение
Переменные окружения — это переменные, которые доступны любым программам, запущенные с данной оболочки. Объявляются они так же как и локальные переменные, но с командой export
:
export глобальная_переменная=значение
В bash есть много переменных окружения, которые достаточно часто встречаются в сценариях, например:
- HOME — путь к домашнему каталогу пользователя;
- PATH — список каталогов, в которых оболочка ищет исполняемые файлы;
- PWD — путь к рабочему каталогу;
- RANDOM — формирует целое случайное число;
- HOSTNAME — имя компьютера, на котором выполняется оболочка;
Условные операторы
Условные операторы в Bash-скриптах позволяют выполнить определенные действия в зависимости от того, выполняется ли какое-то условие или нет. В Bash, условия заключаются в квадратные скобки и передаются в команду «if».
Вот как выглядит синтаксис оператора «if»:
if
[условие]
then
пропишите команды, которые необходимо выполнить, если условие верно
fi
Здесь условие обязательно записывается в квадратных скобках, и если оно истинно, то команды, указанные между «then
» и «fi
», будут выполнены.
Прведу список логических операторов, которые используются для конструкции if-then-else-fi
:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-z # строка пуста -n # строка не пуста =, (==) # строки равны != # строки неравны -eq # равно -ne # неравно -lt,(< ) # меньше -le,(<=) # меньше или равно -gt,(>) #больше -ge,(>=) #больше или равно ! #отрицание логического выражения -a,(&&) #логическое «И» -o,(||) # логическое «ИЛИ» |
Вот приблизительная схема
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.
для построения многоярусных условий вида:
if ...
then ....
else
if ....
then....
else ....
Циклы
Циклы в Bash позволяют выполнять одни и те же команды несколько раз. Существует два основных типа циклов: цикл «for» и цикл «while».
Цикл «for»
Используется при выполнении команд для каждого элемента из определенного списка.
Синтаксис цикла «for» следующий:
1 2 3 4 |
for переменная in список do пропишите команды, которые необходимо выполнить done |
Здесь «переменная» последовательно принимает значения из «списка», и для каждого значения выполняются указанные команды между ключевыми словами «do» и «done».
1 2 3 4 5 |
#!/bin/bash for (( i=1; i <= 10; i++ )) do echo "number is $i" done |
вывод
1 2 3 4 5 6 7 8 9 10 11 |
root@geneviev:~ # ./cycle.sh number is 1 number is 2 number is 3 number is 4 number is 5 number is 6 number is 7 number is 8 number is 9 number is 10 |
Цикл «while»
Используется для выполнения команд до тех пор, пока заданное условие остается истинным.
Синтаксис цикла «while» выглядит следующим образом:
1 2 3 4 |
while [условие] do команды done |
Здесь команды, указанные между «do» и «done», будут выполняться, пока «условие» остается истинным. Условие проверяется перед каждой итерацией цикла.
1 2 3 4 |
while true do echo "this is infinity loop" done |
например
1 2 3 4 5 6 7 |
#!/bin/bash count=0 while [ $count -lt 10 ] do (( count++ )) echo "count: $count" done |
вывод
1 2 3 4 5 6 7 8 9 10 11 |
root@geneviev:~ # ./cycle.sh number is 1 number is 2 number is 3 number is 4 number is 5 number is 6 number is 7 number is 8 number is 9 number is 10 |
Из цикла можно выйти с помощью команды break (работает также и для for):
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash count=0 while [ $count -lt 10 ] do (( count++ )) echo "count: $count" if [ "$count" -gt 5 ] then break fi done |
Вывод:
1 2 3 4 5 6 7 |
root@geneviev:~ # ./cycle.sh count: 1 count: 2 count: 3 count: 4 count: 5 count: 6 |
Функции
Функции в языке Bash служат для группировки команд внутри логически связанных блоков, которые можно вызывать из скриптов.
-
Создание функции
Синтаксис создания функции выглядит следующим образом:
команды_и_выражения
}
-
Аргументы функции
Функции могут принимать аргументы, которые передаются внутри круглых скобок при вызове функции. Внутри функции аргументы доступны через специальные переменные, такие как $1, $2…, где $1 представляет первый аргумент, $2 – второй и так далее:
1 2 3 4 |
my_function () { echo "Первый аргумент: $1" echo "Второй аргумент: $2" } |
my_function
аргумент1 аргумент2Например:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#!/bin/bash function myfunc { echo "This is an example of using a function" } count=1 while [ $count -le 3 ] do myfunc count=$(( $count + 1 )) done echo "This is the end of the loop" myfunc echo "End of the script" |
Работа с файлами и директориями
Bash-скрипты предоставляют средства для выполнения различных действий с файлами и директориями в операционной системе Linux.
Например, чтобы проверить наличие файла, можно использовать команду:
1 |
test -e filename |
Если файл существует, то эта команда вернет значение 0. В противном случае она вернет ненулевое значение.
Как создать скрипт в Linux
- Откройте ваш текстовый редактор и создайте файл с именем hello.sh. В этом примере мы будем использовать nano:
1 |
$ nano hello.sh |
- Скопируйте и вставьте следующие строки в новый файл:
1 2 |
#!/bin/bash echo "Hello World" |
- Перейдите в каталог, где находится ваш скрипт myscript.sh, и сделайте его исполняемым:
1 |
$ chmod +x hello.sh |
- Теперь вы готовы выполнить ваш первый скрипт на Bash:
1 |
$ ./hello.sh |
или
1 |
sh hello.sh |
или
1 |
bash hello.sh |
Результат, который вы получите, должен быть следующим:
Hello World