|
@@ -0,0 +1,241 @@
|
|
|
+# Интегрированная среда разработки Bash (Ковалев Никита 47 группа)
|
|
|
+## Что такое Bash
|
|
|
+__BASH__ (Bourne-Again Shell) — один из наиболее распространенных командных интерпретаторов в UNIX-подобных системах, а также язык интерфейса командной строки, который поддерживает использование переменных, массивов, циклов, функций, арифметических операторов, операций ввода-вывода и прочих возможностей.
|
|
|
+
|
|
|
+Bash был создан и выпущен в 1989 году Брайаном Фоксом как open source замена для Bourne Shell, вышедшей в 1976 году. Его название является аббревиатурой от Bourne Again SHell.
|
|
|
+
|
|
|
+Большинство современных операционных систем, кроме WINDOWS, основаны на UNIX. Это, в том числе, дистрибутивы Linux, macOS, iOS и Android. UNIX характеризуется модульной архитектурой, в которой каждая функция выполняется отдельной программой, а взаимодействие между ними происходит через общую файловую систему. Shell используется для управления этими программами и исполнения команд.
|
|
|
+
|
|
|
+__Shell (оболочка)__ — это программа, обеспечивающая взаимодействие пользователя с системой. В командной строке вы вводите команды, которые оболочка интерпретирует, вызывает соответствующие программы и отображает результаты. Команды могут подаваться не только в текстовом режиме, но и считываться из файла, называемого shell-скриптом или оболочкой shell-программы.
|
|
|
+
|
|
|
+Для обеспечения интерфейса командной строки в операционных системах используются командные интерпретаторы. Они могут представлять собой самостоятельные языки программирования со своим синтаксисом и функциональными возможностями.
|
|
|
+
|
|
|
+Самые популярные командные интерпретаторы — это __Terminal__ (Linux, macOS) и __Konsole__ (Windows). Именно с их помощью можно взаимодействовать с командной оболочкой shell, которая будет принимать специальные команды и передавать их на выполнение операционной системе.
|
|
|
+
|
|
|
+
|
|
|
+Язык Bash поддерживает переменные, массивы, циклы, функции, условные и арифметические операторы, операции ввода-вывода и другие средства. Но главная его фишка — возможность создавать скрипты для ускорения работы на компьютере и автоматизации рутины. Например, с их помощью можно:
|
|
|
+
|
|
|
+* быстро переименовывать все файлы в папке;
|
|
|
+* генерировать случайные пароли;
|
|
|
+* создавать и отправлять отчёты по электронной почте;
|
|
|
+* проверять и обновлять систему и приложения;
|
|
|
+* одной командой очищать кэш браузера.
|
|
|
+
|
|
|
+## Основы Bash
|
|
|
+Для начала — три главных особенности, с которых стоит начать знакомство с Bash:
|
|
|
+
|
|
|
+1. Написание любого скрипта нужно начинать со строки: #!/bin/bash. После символа #! следует путь к bash-интерпретатору. Вы можете узнать путь к нему (возможно, интерпретатор был установлен в другое место) с помощью команды whereis bash.
|
|
|
+2. Комментарии и примечания нужно указывать после символа # (кроме первой строки, где мы указываем путь к bash-интерпретатору)
|
|
|
+3. Bash не имеет строгой системы типов
|
|
|
+
|
|
|
+Тип данных определяется в зависимости от контекста использования переменной и ее содержимого. Bash устанавливает следующие правила для именования переменных:
|
|
|
+
|
|
|
+* Имена переменных должны начинаться с латинской буквы (в верхнем или нижнем регистре) или символа подчеркивания.
|
|
|
+
|
|
|
+* В имени переменной запрещено использовать пробелы или специальные символы.
|
|
|
+
|
|
|
+* Регистр букв в именах переменных учитывается. Переменные name1 и Name1 считаются разными.
|
|
|
+
|
|
|
+* Рекомендуется избегать использования ключевых слов Bash в качестве названий переменных
|
|
|
+
|
|
|
+## Синтаксис, переменные и команды
|
|
|
+
|
|
|
+### Переменные
|
|
|
+
|
|
|
+Переменные в Bash объявляются просто:
|
|
|
+
|
|
|
+```
|
|
|
+message="Good morning!"
|
|
|
+```
|
|
|
+
|
|
|
+Теперь переменная message хранит значение — текстовое сообщение «Hello, World!».
|
|
|
+Вывести значение переменной можно с помощью команды __echo__:
|
|
|
+
|
|
|
+```
|
|
|
+echo $message
|
|
|
+```
|
|
|
+
|
|
|
+В Bash символ __$__ называется символом расширения (expansion character). Поставленный перед именем переменной, он указывает на то, что нужно использовать именно значение переменной, а не одноимённую строку.
|
|
|
+
|
|
|
+Следующий код выведет сообщение «message»:
|
|
|
+```
|
|
|
+message="Hello, World!"
|
|
|
+echo message
|
|
|
+```
|
|
|
+Чтобы сохранить в переменной введённое пользователем значение, используйте команду __read__:
|
|
|
+```
|
|
|
+read name
|
|
|
+# Пользователь вводит что-нибудь
|
|
|
+echo $name
|
|
|
+```
|
|
|
+Если вы хотите добавить сообщение перед пользовательским вводом, добавьте флаг __-p__ и сообщение после команды read:
|
|
|
+
|
|
|
+```
|
|
|
+read -p "Enter your name: " name # Будет выведено «Enter your name: »
|
|
|
+# Пользователь вводит что-то
|
|
|
+echo $name
|
|
|
+```
|
|
|
+
|
|
|
+### Типы данных
|
|
|
+
|
|
|
+Строки __(strings)__ — это набор символов, заключённый в кавычки. В Bash можно писать строки в одинарных '…' или двойных "…" кавычках. Например, 'Привет' и "Мир" — это строки.
|
|
|
+
|
|
|
+Числа __(numbers)__ — это целочисленные значения. Bash поддерживает арифметические операции с целыми числами, включая сложение, вычитание, умножение и деление. Арифметические выражения нужно предварять знаком $ и обрамлять двойными круглыми скобками:
|
|
|
+```
|
|
|
+a=2 b=3
|
|
|
+echo $(($a + $b)) # Будет выведено 5
|
|
|
+```
|
|
|
+Также можно использовать команду __expr__:
|
|
|
+```
|
|
|
+echo $(expr $a + $b) # Будет выведено 5
|
|
|
+```
|
|
|
+Стандартные библиотеки Bash поддерживают следующие арифметические операции:
|
|
|
+
|
|
|
+* Сложение — +.
|
|
|
+* Вычитание — -.
|
|
|
+* Умножение — *.
|
|
|
+* Целочисленное деление — /.
|
|
|
+* Остаток от деления — %.
|
|
|
+* Возведение в степень — **.
|
|
|
+
|
|
|
+Массивы __(arrays)__ — тип переменных, который может хранить несколько значений. Элементы массива перечисляются в круглых скобках через пробел:
|
|
|
+```
|
|
|
+my_array=(apple banana cherry)
|
|
|
+```
|
|
|
+При использовании переменной массива в команде применяются фигурные скобки. Если мы хотим вывести его отдельные элементы, это можно сделать с помощью символа $ и номера индекса в квадратных скобках:
|
|
|
+```
|
|
|
+echo ${my_array[0]} # Выведет «apple»
|
|
|
+echo ${my_array[1]} # Выведет «banana»
|
|
|
+echo ${my_array[2]} # Выведет «cherry»
|
|
|
+```
|
|
|
+А если нам нужно получить сразу все элементы массива, вместо индекса в квадратных скобках нужно поставить символ __* или @__
|
|
|
+
|
|
|
+Логические значения __(boolean)__ — нужны для того, чтобы проверить, выполняется ли какое-то условие или нет. Они могут быть либо __true (истина)__, либо __false (ложь)__. Например, в операторах if и while мы пишем условие, и если оно true, то выполняем какое-то действие.
|
|
|
+
|
|
|
+В Bash логические значения представлены целыми числами. Число 0 означает true, а любое другое число означает false. Когда мы выводим логическое значение на экран, то вместо true мы видим 0.
|
|
|
+
|
|
|
+Также в Bash есть операторы сравнения. Например, эти нужны для строк:
|
|
|
+
|
|
|
+= проверяет, одинаковы ли две строки.
|
|
|
+!= проверяет, различаются ли две строки.
|
|
|
+А эти — для чисел:
|
|
|
+
|
|
|
+* __-eq__ проверяет, равны ли два числа.
|
|
|
+* __-ne__ проверяет, различаются ли два числа.
|
|
|
+* __-gt__ проверяет, больше ли первое число, чем второе.
|
|
|
+* __-lt__ проверяет, меньше ли первое число, чем второе.
|
|
|
+* __-ge__ выводит true, если первое число больше или равно второму.
|
|
|
+* __-le__ выводит true, если первое число меньше или равно второму.
|
|
|
+
|
|
|
+Использовать операторы сравнения можно с помощью команды __test__. Команда test принимает два значения и оператор сравнения и возвращает 1 или 0 в зависимости от результата:
|
|
|
+```
|
|
|
+test "hello" = "hello"
|
|
|
+echo $?
|
|
|
+# Выведет 0 (true), так как строки одинаковые
|
|
|
+test "hello" != "world"
|
|
|
+echo $?
|
|
|
+# Выведет 0 (true), так как строки различаются
|
|
|
+```
|
|
|
+### Ветвления
|
|
|
+Ветвления __if-then-else__ позволяют проверить условие и выполнить один набор команд, если условие истинно, и другой набор команд, если условие ложно. Это выглядит так:
|
|
|
+```
|
|
|
+if [ условие ];
|
|
|
+then
|
|
|
+ # Команды, которые нужно выполнить, если условие истинно
|
|
|
+else
|
|
|
+ # Команды, которые нужно выполнить, если условие ложно
|
|
|
+fi
|
|
|
+```
|
|
|
+Открывающую и закрывающую квадратные скобки нужно отделять от операндов пробелами.
|
|
|
+
|
|
|
+А если в паре с основным условием нужно проверить дополнительное, используют конструкцию __elif__:
|
|
|
+```
|
|
|
+if [ условие_1 ];
|
|
|
+then
|
|
|
+ # Команды, которые нужно выполнить, если условие_1 истинно
|
|
|
+elif [ условие_2 ];
|
|
|
+then
|
|
|
+ # Команды, которые нужно выполнить, если условие_2 истинно
|
|
|
+else
|
|
|
+ # Команды, которые нужно выполнить, если все условия ложны
|
|
|
+fi
|
|
|
+```
|
|
|
+Существует и более короткая форма записи условной конструкции — if-then. Её используют, когда нужно проверить только одно условие:
|
|
|
+```
|
|
|
+if [ условие ];
|
|
|
+then
|
|
|
+# Команды, которые нужно выполнить
|
|
|
+fi
|
|
|
+```
|
|
|
+В этом случае команды будут выполнены, только если условие истинно.
|
|
|
+
|
|
|
+Cписок логических операторв, которые используются для конструкции if-then-else-fi:
|
|
|
+* -z # строка пуста
|
|
|
+* -n # строка не пуста
|
|
|
+* =, (==) # строки равны
|
|
|
+* != # строки неравны
|
|
|
+* -eq # равно
|
|
|
+* -ne # неравно
|
|
|
+* -lt,(< ) # меньше
|
|
|
+* -le,(<=) # меньше или равно
|
|
|
+* -gt,(>) #больше
|
|
|
+* -ge,(>=) #больше или равно
|
|
|
+* ! #отрицание логического выражения
|
|
|
+* -a,(&&) #логическое «И»
|
|
|
+* -o,(||) # логическое «ИЛИ»
|
|
|
+
|
|
|
+### Циклы
|
|
|
+Как и в большинстве языков программирования, в Bash есть циклы. Они бывают двух видов:
|
|
|
+
|
|
|
+* for — когда количество итераций заранее известно.
|
|
|
+* while — когда количество итераций заранее не известно.
|
|
|
+
|
|
|
+Вот как выглядит сигнатура цикла for:
|
|
|
+```
|
|
|
+for переменная цикла in элемент1 элемент2 ... элементN
|
|
|
+do
|
|
|
+# Команды, которые будут выполняться в цикле
|
|
|
+done
|
|
|
+```
|
|
|
+Количество итераций (часть между in и do) можно указать простым перечислением элементов:
|
|
|
+```
|
|
|
+for fruit in apple banana cherry
|
|
|
+do
|
|
|
+ echo "I like $fruit"
|
|
|
+done
|
|
|
+```
|
|
|
+Будет выведено:
|
|
|
+```
|
|
|
+# I like apple
|
|
|
+# I like banana
|
|
|
+# I like cherry
|
|
|
+```
|
|
|
+Для явного указания нужного количества итераций используют арифметические выражения:
|
|
|
+```
|
|
|
+for ((i=0; i<5; i++))
|
|
|
+do
|
|
|
+ echo "Iteration number $i"
|
|
|
+done
|
|
|
+```
|
|
|
+Будет выведено:
|
|
|
+```
|
|
|
+# Iteration number 0
|
|
|
+# Iteration number 1
|
|
|
+# Iteration number 2
|
|
|
+# Iteration number 3
|
|
|
+# Iteration number 4
|
|
|
+```
|
|
|
+А вот так выглядит сигнатура цикла __while__:
|
|
|
+```
|
|
|
+while [ условие ]
|
|
|
+do
|
|
|
+ # Команды, которые будут выполняться в цикле
|
|
|
+done
|
|
|
+```
|
|
|
+Условие __(condition)__ — это выражение, результат которого является логическим значением true или false. Команды внутри цикла будут выполняться до тех пор, пока condition возвращает true.
|
|
|
+
|
|
|
+## Литература
|
|
|
+
|
|
|
+1. <https://skillbox.ru/media/code/kak-polzovatsya-bash-ekspressrukovodstvo-dlya-nachinayushchikh/>
|
|
|
+2. <https://cloud.vk.com/blog/detali-raboty-bash>
|
|
|
+3. <https://1cloud.ru/blog/bash_basics>
|