bash (сокр. от «Bourne-Again shell») — это командная оболочка (или «интерпретатор командной строки»), используемая по умолчанию в операционных системах на базе Unix и Linux, созданная в 1989 году Брайаном Фоксом с целью усовершенствования командной оболочки sh.
bash позволяет автоматизировать различные задачи, устанавливать программное обеспечение, настраивать конфигурации для своего рабочего окружения и многое другое. В этой статье мы рассмотрим использование нескольких основных команд в bash, а также рассмотрим гайд по созданию bash-скриптов.
Что такое терминал?
Терминал — это программа, которая используется для взаимодействия с шеллом. Это просто интерфейс к нему и другим программам командной строки, которые работают внутри нее. Вот как выглядит типичный терминал (Konsole) в Debian 11 (окружение рабочего стола — KDE Plasma):
Типичный терминал в Linux
Всякий раз, когда мы открываем окно терминала, мы видим приглашение шелла — имя_пользователя@имя_машины:~$
. Символ $
означает, что мы работаем под учетной записью обычного пользователя, а символ ~
(тильда) означает, что в данный момент мы находимся в домашнем каталоге /home/<имя_пользователя>.
Команды в bash
Команда в bash — это наименьшая единица кода, которую bash может выполнить. С помощью команд мы сообщаем шеллу, что нам нужно, чтобы он сделал. bash обычно принимает от пользователя одну команду и возвращается к нему после того, как команда будет выполнена. Чтобы немного освоиться в bash, давайте попробуем выполнить несколько простых команд.
Команда echo — возвращает всё, что вы вводите в командной строке:
Пример использования команды echo
Команда date — отображает текущее время и дату:
Пример использования команды date
Команда pwd (сокр. от «print working directory») — указывает на текущий рабочий каталог, в котором команды шелла будут искать файлы.
Файловая иерархия в Linux имеет древовидную структуру, поэтому, чтобы добраться до указанного каталога или файла, нам нужно пройти определенный путь, каждый узел которого отделен от других узлов символом /
.
Пример использования команды pwd
Команда ls (сокр. от «list») — отображает содержимое каталога. Обычно, команда ls
начинает с просмотра нашего домашнего каталога. Это означает, что если мы просто напечатаем ls
, то данная команда выведет содержимое текущего каталога, которым в нашем примере является домашний каталог /home/diego:
Пример использования команды ls
Команда cd (сокр. от «change directory») — изменяет текущую директорию на заданную пользователем. Рассмотрим некоторые примеры использования данной команды:
cd <директория>
— меняет текущую директорию на заданную. Давайте попробуем с помощью команды ls
перейти к корневому каталогу /
и ознакомимся с его содержимым. Обратите внимание, что мы также можем использовать точку с запятой ;
для записи двух команд в одной строке.
Пример объединения двух команд в одной строке
cd ..
— вернуться в родительский каталог.
cd
— вернуться в домашний каталог.
Команда mkdir (сокр. от «make directory») — создает новый каталог.
Команда mv (сокр. от «move») — перемещает один или несколько файлов/каталогов из одного места в другое (заданное пользователем). Для этого нужно указать, что мы хотим переместить (т.е. источник), и куда мы хотим переместить (т.е. пункт назначения).
В качестве примера я создам новый каталог Ravesli в своей домашней директории и перемещу в него все .txt-файлы (ну как «все», у меня там только один файл — Адреса.txt) из /home/diego/Документы/ с помощью двух вышеприведенных команд:
Перемещение файлов с помощью команды mv
Команда touch — создает новые пустые файлы (а также изменяет временные метки в существующих файлах и каталогах). Вот как мы можем создать пустой файл под названием foo.txt в папке Ravesli из домашнего каталога:
Создание файла с помощью команды touch
Команда rm (сокр. от «remove») — удаляет файлы/каталоги. По умолчанию, команда rm
НЕ удаляет каталоги, но если используется как rm -r *
внутри заданного каталога, то каждый подкаталог и файл внутри заданного каталога — удаляются.
Давайте удалим ранее созданный файл foo.txt:
Удаление файла с помощью команды rm
Команда rmdir (сокр. от «remove directory») — удаляет каталоги.
Давайте удалим созданный ранее каталог /home/diego/Ravesli:
Удаление каталогов с помощью команды rmdir
Команда cat (сокр. от «concatenate») — считывает файл и выводит его содержимое. Она может работать с несколькими файлами, объединяя их вывод в единый поток (отсюда и происходит её название). У меня в домашнем каталоге есть папка untitled с файлами С++/Qt-проекта, и ниже я использую команду cat
для просмотра содержимого файла main.cpp из untitled:
Пример использования команды cat
Чтобы просмотреть несколько файлов, укажите друг за другом (через пробел) имена требуемых файлов после команды cat
, например:
Просмотр нескольких файлов с помощью команды cat
Команда man (сокр. от «manual») — отображает справочные страницы, которые являются руководством пользователя, встроенным по умолчанию во многие дистрибутивы Linux и большинство систем Unix. Например, команда man bash
отобразит руководство пользователя, а команда man ls
отобразит справку по команде ls
.
Отображение справочной информации с помощью команды man
Редактор nano
nano — это маленький, простой, консольный текстовый редактор *nix-подобных операционных систем, впервые увидевший свет в далеком 1999 году. Для запуска редактора достаточно ввести в терминале всего одну команду — nano
. Если же нужно отредактировать какой-то конкретный файл, то применяется команда nanо /<путь_к_файлу/<имя_файла>
. Отличительной чертой данного редактора является то, что он управляется сочетаниями клавиш. Например, для сохранения текущего документа применяется сочетание Ctrl+O, для вызова меню поиска — Ctrl+W, для выхода из редактора — Ctrl+X, а для получения всего списка доступных сочетаний клавиш — Ctrl+G.
Гайд по созданию bash-скриптов
Наш шелл, это не только промежуточное звено между пользователем и системой, но еще и мощный язык программирования. Программы, написанные на языке шелла, называются shell-скриптами (или shell-сценариями) и имеют соответствующее расширение файлов — .sh. Сам язык содержит полный набор утилит и команд, доступных в *nix-системах, а также циклы, условные операторы, объявление переменных и пр. Такие скрипты будут очень полезными там, где не требуется использование полноценных языков программирования, например, в задачах администрирования операционной системы.
Создание bash-скрипта
Чтобы создать новый файл bash-скрипта, откройте в любом редакторе текстовый файл и сохраните его с расширением .sh. Все дальнейшие эксперименты я будут проводить в Debian Linux, с применением текстового редактора nano.
Давайте создадим новый файл ravesli.sh:
diego@debian:~$ touch ravesli.sh
diego@debian:~$ ls -l
-rw-r--r-- 1 diego diego 0 мар 9 14:59 ravesli.sh
diego@debian:~$
Чтобы выполнить файл bash-скрипта, нужно изменить права доступа к файлу и сделать его исполняемым. Разрешение, как вы наверняка помните из предыдущих уроков, изменяется командой chmod +x <имя_файла>
:
diego@debian:~$ chmod +x ravesli.sh
diego@debian:~$ ls -l
итого 40
drwxr-xr-x 2 diego diego 4096 фев 27 00:23 build-untitled-Desktop-Debug
-rwxr-xr-x 1 diego diego 0 мар 9 14:59 ravesli.sh
Выполнение bash-скрипта
Файл bash-скрипта может быть запущен двумя способами:
Способ №1: bash <имя_файла>
. Чтобы выполнить скрипт, просто напишите в терминале команду bash
, а затем (через пробел) имя файла и нажмите Enter.
Способ №2: ./<имя_файла>
. Чтобы выполнить скрипт введите команду ./<имя_файла>
и нажмите Enter.
Команда echo
Команда echo — это самая фундаментальная и базовая команда в bash-скриптах. Её основное предназначение заключается в выводе любой информации на экран. Давайте откроем c помощью nano (или любого другого текстового редактора) файл ravesli.sh и попробуем применить команду echo
для вывода некоторого текста в терминале.
1 2 3 4 |
#!/bin/bash echo "Привет, Ravesli !" echo "Эта команда была выполнена с помощью bash-скрипта" |
Далее, нажимаем Ctrl+O для сохранения изменений и Ctrl+X для выхода из nano.
Примечание: Каждый bash-скрипт всегда должен начинаться со строки:
1 |
#!/bin/bash |
В данной строке после #!
указывается путь к командной оболочке bash. Если у вас bash находится в другом месте, то с помощью команды whereis bash
вы можете узнать, где именно, и указать свой путь.
Запустим наш файл и увидим:
diego@debian:~$ ./ravesli.sh
Привет, Ravesli !
Эта команда была выполнена с помощью bash-скрипта
diego@debian:~$
Комментарии
Комментарии — это важная часть компьютерных программ. Они являются неисполняемыми строками, улучшающими читабельность кода и помогающими понять его назначение. В файле bash-скрипта мы можем добавлять однострочные и многострочные комментарии:
однострочные комментарии начинаются с символа #
;
многострочные комментарии начинаются с одинарной кавычки '
, а символ двоеточия :
используется для добавления строк в комментарий.
Давайте рассмотрим простой пример применения комментариев в bash-скриптах:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash # Применение команды echo # Это – однострочный комментарий echo "Всем привет! Это – пример однострочного комментария!" : ' А вот – многострочный комментарий Давайте еще раз применим команду echo ' echo "Bash – крутая штука" |
Результат:
Объявление и использование переменных
Вы наверняка помните, что переменные нужны для хранения данных или некоторой информации. Они являются важным аспектом любого языка программирования. Использовать переменные в bash очень просто — они объявляются путем написания своего имени. В дальнейшем, при обращении к переменной мы должны указать символ $
вместе с ней.
Давайте объявим и применим переменную в нашем файле bash-скрипта:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash #объявляем переменную VAR="Добро пожаловать на Ravesli.com !" #используем переменную echo $VAR #объявляем переменную num1 num1=10 #объявляем переменную num2 num2=20 #вычисляем сумму и сохраняем её в переменной num3 num3=$(($num1+$num2)) #выводим на экран переменную sum echo "Сумма: $num3" |
Результат:
Условный оператор if
Условные операторы в bash используются для принятия решений. В условных операторах вычисляется конкретное условие. Если условие истинно (true), то выполняется первый блок кода. В противном случае (false) выполняется второй блок кода.
Мы можем вычислить одно или несколько условий внутри блока if с помощью операторов OR (||
) и AND (&&
). В bash блок if начинается с ключевого слова if
и заканчивается ключевым словом fi
. Если заданное условие ложно, то выполняется блок else.
Давайте посмотрим, как выполняются условные операторы в bash. Мы объявили переменную, а затем вычисляем её и принимаем решение на основе её значения. При этом, для проверки по типу «меньше, чем» применяется запись –lt
, для «больше, чем» — запись -gt
, а для проверки на «равно» — запись -eq
:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash #объявляем переменную VAR=7 if [ $VAR -lt 10 ]; then echo "Число меньше 10" else echo "Число равно 10" fi |
Результат:
Вывод показывает, что Число меньше 10
, потому что значение переменной равно 7, что явно меньше 10. В данном примере выполняется условие.
Аналогично, мы можем использовать условие OR (||
) и AND (&&
) внутри блока if для вычисления нескольких условий. Давайте рассмотрим пример оператора OR:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash #объявляем переменную VAR=7 #используем оператор OR в if-условии if [[ ( $VAR -gt 5 ) || ( $VAR -eq 7 ) ]] then echo "Число больше 5 или равно 7" else echo "Число не больше 5 и не равно 7" fi |
Результат:
Теперь давайте реализуем оператор AND внутри условия if. В операторе AND оба условия должны быть истинными.
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/bin/bash #объявление переменной VAR=7 #используем оператор AND в if-условии if [[ ( $VAR -gt 5 ) && ( $VAR -lt 10 ) ]] then echo "Были выполнены оба условия" else echo "Условия не были выполнены" fi |
Результат:
Оператор else if
Оператор else if используется для вычисления нескольких условий. Чтобы определить оператор else if, применяется ключевое слово elif
.
Давайте рассмотрим пример с пользовательским вводом (ключевое слово read
используется для получения входных данных от пользователя):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#!/bin/bash echo "Введите число" read num #объявляем переменную if [ $num -gt 10 ]; then echo "Число больше 10" elif [ $num -eq 10 ]; then echo "Число равно 10." elif [ $num -lt 10 ]; then echo "Число меньше 10" else echo "Некорректное число" fi |
Результат:
Цикл while
Цикл while используется для многократного выполнения кода. Он вычисляет условие и продолжает выполнение до тех пор, пока условие не станет ложным. Синтаксис цикла while в bash выглядит следующим образом:
while [условие]
do
выражения_и_команды
done
Если [условие]
истинно, то выполняется блок do
.
Ниже представлен пример цикла while. Цикл продолжает выполнение до тех пор, пока значение переменной не станет меньше 10. Внутри блока do мы увеличиваем значение переменной на 1 в каждой итерации. Цикл завершается, когда условие становится ложным.
1 2 3 4 5 6 7 8 9 10 11 |
#!/bin/bash #объявление переменной VAR=1 while [ $VAR -le 10 ] do echo "Значение переменной = $VAR" #увеличиваем значение переменной на 1 (( VAR++ )) done |
Цикл for
Цикл for также применяется для многократного выполнения одного и того же блока кода. Синтаксис цикла for в bash выглядит следующим образом:
for ((объявление_переменных; условие; инкремент/декремент_счетчика))
do
выражения_и_команды
done
Рассмотрим пример цикла for, в котором будем увеличивать значение переменной и выводить его в каждой итерации:
1 2 3 4 5 6 7 8 9 10 |
#!/bin/bash #объявляем цикл for for ((i=0; i<10; i++)) do #выводим на экран значение переменной echo -n "$i " done echo "\n" |
Заключение
Инструменты командной строки могут стать для вас отличными помощниками в плане автоматизации рутинных задач. Поначалу всё это может вас напугать, но стоит вам немного освоиться с консолью и написанием скриптов, как вы сразу почувствуете всю силу, мощь и громадный потенциал данного инструмента.
Не понял, когда в операторе elif нужнa в конце "точка с запятой", а когда нет. Поясните, пожалуйста.
Продолжайте в том же духе,очень помогаете 🙂
Постараемся 🙂
Добрый день, в статье вы используете Debian10? Это скорее опечатка у вас.
В статье используется тестовая ветка Debian 10, которую сами разработчики именуют Debian 11 ("bullseye").
P.S.: Более того, ниже я прикрепил скриншот, на котором даже стартовый экран загрузки системы прозрачно намекает о версии дистрибутива 🙂
https://ibb.co/PjybcmC