HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-21
1 <p>Если вы уже пользуетесь Linux, то наверняка ваши запросы к работе с компьютером шире, чем у пользователей Windows или macOS. Bash поможет вам эффективнее использовать Linux, автоматизировать рутинные задачи и в целом работать быстрее, чем позволяет графический интерфейс.</p>
1 <p>Если вы уже пользуетесь Linux, то наверняка ваши запросы к работе с компьютером шире, чем у пользователей Windows или macOS. Bash поможет вам эффективнее использовать Linux, автоматизировать рутинные задачи и в целом работать быстрее, чем позволяет графический интерфейс.</p>
2 <p>Если вы перешли на Linux недавно, то почитайте наш<a>гайд по командам Bash</a>. Здесь же мы будем разбираться в тонкостях языка и писать скрипт - это чуть более продвинутый уровень.</p>
2 <p>Если вы перешли на Linux недавно, то почитайте наш<a>гайд по командам Bash</a>. Здесь же мы будем разбираться в тонкостях языка и писать скрипт - это чуть более продвинутый уровень.</p>
3 <p><strong>Содержание</strong></p>
3 <p><strong>Содержание</strong></p>
4 <ul><li><a>Что такое Bash</a></li>
4 <ul><li><a>Что такое Bash</a></li>
5 <li><a>Синтаксис Bash: из чего состоит</a></li>
5 <li><a>Синтаксис Bash: из чего состоит</a></li>
6 </ul><ul><li><a>Переменные</a></li>
6 </ul><ul><li><a>Переменные</a></li>
7 <li><a>Типы данных</a></li>
7 <li><a>Типы данных</a></li>
8 <li><a>Ветвления</a></li>
8 <li><a>Ветвления</a></li>
9 <li><a>Циклы</a></li>
9 <li><a>Циклы</a></li>
10 <li><a>Функции</a></li>
10 <li><a>Функции</a></li>
11 </ul><ul><li><a>Пишем первый скрипт</a></li>
11 </ul><ul><li><a>Пишем первый скрипт</a></li>
12 <li><a>Заключение</a></li>
12 <li><a>Заключение</a></li>
13 </ul><p><strong>Bash (Bourne again shell)</strong> - это стандартная командная оболочка в большинстве дистрибутивов Linux и macOS, а также язык для этой оболочки.</p>
13 </ul><p><strong>Bash (Bourne again shell)</strong> - это стандартная командная оболочка в большинстве дистрибутивов Linux и macOS, а также язык для этой оболочки.</p>
14 <p>Язык Bash поддерживает переменные, массивы, циклы, функции, условные и арифметические операторы, операции ввода-вывода и другие средства. Но главная его фишка - возможность создавать скрипты для ускорения работы на компьютере и автоматизации рутины. Например, с их помощью можно:</p>
14 <p>Язык Bash поддерживает переменные, массивы, циклы, функции, условные и арифметические операторы, операции ввода-вывода и другие средства. Но главная его фишка - возможность создавать скрипты для ускорения работы на компьютере и автоматизации рутины. Например, с их помощью можно:</p>
15 <ul><li>быстро переименовывать все файлы в папке;</li>
15 <ul><li>быстро переименовывать все файлы в папке;</li>
16 <li>генерировать случайные пароли;</li>
16 <li>генерировать случайные пароли;</li>
17 <li>создавать и отправлять отчёты по электронной почте;</li>
17 <li>создавать и отправлять отчёты по электронной почте;</li>
18 <li>проверять и обновлять систему и приложения;</li>
18 <li>проверять и обновлять систему и приложения;</li>
19 <li>одной командой очищать кэш браузера.</li>
19 <li>одной командой очищать кэш браузера.</li>
20 </ul><p>Последний скрипт из этого списка мы и попробуем написать в этой статье. Но для начала рассмотрим продвинутый синтаксис Bash и его основные конструкции: переменные, операторы, циклы и функции.</p>
20 </ul><p>Последний скрипт из этого списка мы и попробуем написать в этой статье. Но для начала рассмотрим продвинутый синтаксис Bash и его основные конструкции: переменные, операторы, циклы и функции.</p>
21 <em>Кадр: мультфильм "Тачки" / Pixar</em><p>Кодить будем в терминале Linux - он открывается сочетанием клавиш<strong>Ctrl + Alt + T</strong>. Если вы хотите научиться работать с Bash, но пока не пользуетесь Linux, то пишите код в одном из онлайн-терминалов - например,<a>Replit</a>.</p>
21 <em>Кадр: мультфильм "Тачки" / Pixar</em><p>Кодить будем в терминале Linux - он открывается сочетанием клавиш<strong>Ctrl + Alt + T</strong>. Если вы хотите научиться работать с Bash, но пока не пользуетесь Linux, то пишите код в одном из онлайн-терминалов - например,<a>Replit</a>.</p>
22 <p>Переменные в Bash объявляются просто:</p>
22 <p>Переменные в Bash объявляются просто:</p>
23 message="Hello, World!"<p>Теперь переменная message хранит значение - текстовое сообщение "Hello, World!". Давайте выведем его - сделать это можно с помощью команды echo:</p>
23 message="Hello, World!"<p>Теперь переменная message хранит значение - текстовое сообщение "Hello, World!". Давайте выведем его - сделать это можно с помощью команды echo:</p>
24 echo $message # Будет выведено "Hello, World!"<p>Обратите внимание на отсутствие пробелов. В Bash пробелы являются разделителями. Если пробелы есть, то Bash будет считать их отдельными токенами и выдавать ошибки.</p>
24 echo $message # Будет выведено "Hello, World!"<p>Обратите внимание на отсутствие пробелов. В Bash пробелы являются разделителями. Если пробелы есть, то Bash будет считать их отдельными токенами и выдавать ошибки.</p>
25 <p>Следующий код приведёт к ошибке:</p>
25 <p>Следующий код приведёт к ошибке:</p>
26 message = "Hello, World!" bash: message: command not found<p>Также обратите внимание на символ $<strong>-</strong>в Bash он называется символом расширения (expansion character). Поставленный перед именем переменной, он указывает на то, что нужно использовать именно значение переменной, а не одноимённую строку.</p>
26 message = "Hello, World!" bash: message: command not found<p>Также обратите внимание на символ $<strong>-</strong>в Bash он называется символом расширения (expansion character). Поставленный перед именем переменной, он указывает на то, что нужно использовать именно значение переменной, а не одноимённую строку.</p>
27 <p>Следующий код выведет сообщение "message":</p>
27 <p>Следующий код выведет сообщение "message":</p>
28 message="Hello, World!" echo message<p>Чтобы сохранить в переменной введённое пользователем значение, используйте команду read:</p>
28 message="Hello, World!" echo message<p>Чтобы сохранить в переменной введённое пользователем значение, используйте команду read:</p>
29 read name # Пользователь вводит что-то - например, "Olga" echo $name # Будет выведено "Olga"<p>Если вы хотите добавить сообщение перед пользовательским вводом, добавьте флаг -p и сообщение после команды read:</p>
29 read name # Пользователь вводит что-то - например, "Olga" echo $name # Будет выведено "Olga"<p>Если вы хотите добавить сообщение перед пользовательским вводом, добавьте флаг -p и сообщение после команды read:</p>
30 read -p "Enter your name: " name # Будет выведено "Enter your name: " # Пользователь вводит что-то - например, "Olga" echo $name # Будет выведено "Olga"<p>В Bash есть несколько правил именования переменных:</p>
30 read -p "Enter your name: " name # Будет выведено "Enter your name: " # Пользователь вводит что-то - например, "Olga" echo $name # Будет выведено "Olga"<p>В Bash есть несколько правил именования переменных:</p>
31 <ul><li>Имя переменной должно начинаться с буквы латинского алфавита (нижнего или верхнего регистра) или символа подчёркивания _.</li>
31 <ul><li>Имя переменной должно начинаться с буквы латинского алфавита (нижнего или верхнего регистра) или символа подчёркивания _.</li>
32 <li>Оно может включать буквы, цифры и символ подчёркивания, но не может содержать пробелы или специальные символы.</li>
32 <li>Оно может включать буквы, цифры и символ подчёркивания, но не может содержать пробелы или специальные символы.</li>
33 <li>Регистр букв в именах переменных имеет значение. Например, переменные var1 и Var1 будут рассматриваться как разные.</li>
33 <li>Регистр букв в именах переменных имеет значение. Например, переменные var1 и Var1 будут рассматриваться как разные.</li>
34 <li>Не рекомендуется использовать зарезервированные слова Bash в качестве имён переменных.</li>
34 <li>Не рекомендуется использовать зарезервированные слова Bash в качестве имён переменных.</li>
35 </ul><p>Ну что же, вот мы и создали нашу первую переменную. Поздравляем! Пока эта переменная содержит всего один тип данных - строковый (string). Но в Bash он далеко не единственный - давайте разберём ещё несколько.</p>
35 </ul><p>Ну что же, вот мы и создали нашу первую переменную. Поздравляем! Пока эта переменная содержит всего один тип данных - строковый (string). Но в Bash он далеко не единственный - давайте разберём ещё несколько.</p>
36 <p><strong>Важная оговорка</strong></p>
36 <p><strong>Важная оговорка</strong></p>
37 <p>В Bash нет строгой системы типов, как в некоторых других языках. Тип данных зависит от содержимого переменной и контекста её использования. Поэтому термин "типы данных" в этой статье используется условно, для облегчения понимания. Простите нам это упрощение.</p>
37 <p>В Bash нет строгой системы типов, как в некоторых других языках. Тип данных зависит от содержимого переменной и контекста её использования. Поэтому термин "типы данных" в этой статье используется условно, для облегчения понимания. Простите нам это упрощение.</p>
38 <p><strong>Строки (strings)</strong> - это набор символов, заключённый в кавычки. В Bash можно писать строки в одинарных '…' или двойных "…" кавычках. Например, 'Привет' и "Мир" - это строки.</p>
38 <p><strong>Строки (strings)</strong> - это набор символов, заключённый в кавычки. В Bash можно писать строки в одинарных '…' или двойных "…" кавычках. Например, 'Привет' и "Мир" - это строки.</p>
39 <p><strong>Числа (numbers)</strong> - это целочисленные значения. Bash поддерживает арифметические операции с целыми числами, включая сложение, вычитание, умножение и деление. Арифметические выражения нужно предварять знаком $ и обрамлять двойными круглыми скобками:</p>
39 <p><strong>Числа (numbers)</strong> - это целочисленные значения. Bash поддерживает арифметические операции с целыми числами, включая сложение, вычитание, умножение и деление. Арифметические выражения нужно предварять знаком $ и обрамлять двойными круглыми скобками:</p>
40 a=2 b=3 echo $(($a + $b)) # Будет выведено 5<p>Также можно использовать команду expr:</p>
40 a=2 b=3 echo $(($a + $b)) # Будет выведено 5<p>Также можно использовать команду expr:</p>
41 echo $(expr $a + $b) # Будет выведено 5<p>Стандартные библиотеки Bash поддерживают следующие арифметические операции:</p>
41 echo $(expr $a + $b) # Будет выведено 5<p>Стандартные библиотеки Bash поддерживают следующие арифметические операции:</p>
42 <ul><li>Сложение - +.</li>
42 <ul><li>Сложение - +.</li>
43 <li>Вычитание - -.</li>
43 <li>Вычитание - -.</li>
44 <li>Умножение - *.</li>
44 <li>Умножение - *.</li>
45 <li>Целочисленное деление - /.</li>
45 <li>Целочисленное деление - /.</li>
46 <li>Остаток от деления - %.</li>
46 <li>Остаток от деления - %.</li>
47 <li>Возведение в степень - **.</li>
47 <li>Возведение в степень - **.</li>
48 </ul><p><strong>Примечание</strong>: арифметические операторы в Bash не работают с числами с плавающей точкой.</p>
48 </ul><p><strong>Примечание</strong>: арифметические операторы в Bash не работают с числами с плавающей точкой.</p>
49 <p><strong>Массивы (arrays)</strong> - тип переменных, который может хранить несколько значений. Элементы массива перечисляются в круглых скобках через пробел:</p>
49 <p><strong>Массивы (arrays)</strong> - тип переменных, который может хранить несколько значений. Элементы массива перечисляются в круглых скобках через пробел:</p>
50 my_array=(apple banana cherry)<p>При использовании переменной массива в команде применяются фигурные скобки. Если мы хотим вывести его отдельные элементы, это можно сделать с помощью символа $ и номера индекса в квадратных скобках:</p>
50 my_array=(apple banana cherry)<p>При использовании переменной массива в команде применяются фигурные скобки. Если мы хотим вывести его отдельные элементы, это можно сделать с помощью символа $ и номера индекса в квадратных скобках:</p>
51 echo ${my_array[0]} # Выведет "apple" echo ${my_array[1]} # Выведет "banana" echo ${my_array[2]} # Выведет "cherry"<p>А если нам нужно получить сразу все элементы массива, вместо индекса в квадратных скобках нужно поставить символ * или @:</p>
51 echo ${my_array[0]} # Выведет "apple" echo ${my_array[1]} # Выведет "banana" echo ${my_array[2]} # Выведет "cherry"<p>А если нам нужно получить сразу все элементы массива, вместо индекса в квадратных скобках нужно поставить символ * или @:</p>
52 echo ${my_array[*]} # Выведет "apple banana cherry" echo ${my_array[@]} # Выведет "apple banana cherry"<p><strong>Логические значения (boolean)</strong> - нужны для того, чтобы проверить, выполняется ли какое-то условие или нет. Они могут быть либо true (истина), либо false (ложь). Например, в операторах if и while мы пишем условие, и если оно true, то выполняем какое-то действие.</p>
52 echo ${my_array[*]} # Выведет "apple banana cherry" echo ${my_array[@]} # Выведет "apple banana cherry"<p><strong>Логические значения (boolean)</strong> - нужны для того, чтобы проверить, выполняется ли какое-то условие или нет. Они могут быть либо true (истина), либо false (ложь). Например, в операторах if и while мы пишем условие, и если оно true, то выполняем какое-то действие.</p>
53 <p>В Bash логические значения представлены целыми числами. Число 0 означает true, а любое другое число означает false. Когда мы выводим логическое значение на экран, то вместо true мы видим 0.</p>
53 <p>В Bash логические значения представлены целыми числами. Число 0 означает true, а любое другое число означает false. Когда мы выводим логическое значение на экран, то вместо true мы видим 0.</p>
54 <p>Также в Bash есть операторы сравнения. Например, эти нужны для строк:</p>
54 <p>Также в Bash есть операторы сравнения. Например, эти нужны для строк:</p>
55 <ul><li>= проверяет, одинаковы ли две строки.</li>
55 <ul><li>= проверяет, одинаковы ли две строки.</li>
56 <li>!= проверяет, различаются ли две строки.</li>
56 <li>!= проверяет, различаются ли две строки.</li>
57 </ul><p>А эти - для чисел:</p>
57 </ul><p>А эти - для чисел:</p>
58 <ul><li>-eq проверяет, равны ли два числа.</li>
58 <ul><li>-eq проверяет, равны ли два числа.</li>
59 <li>-ne проверяет, различаются ли два числа.</li>
59 <li>-ne проверяет, различаются ли два числа.</li>
60 <li>-gt проверяет, больше ли первое число, чем второе.</li>
60 <li>-gt проверяет, больше ли первое число, чем второе.</li>
61 <li>-lt проверяет, меньше ли первое число, чем второе.</li>
61 <li>-lt проверяет, меньше ли первое число, чем второе.</li>
62 <li>-ge выводит true, если первое число больше или равно второму.</li>
62 <li>-ge выводит true, если первое число больше или равно второму.</li>
63 <li>-le выводит true, если первое число меньше или равно второму.</li>
63 <li>-le выводит true, если первое число меньше или равно второму.</li>
64 </ul><p>Использовать операторы сравнения можно с помощью команды test. Команда test принимает два значения и оператор сравнения и возвращает 1 или 0 в зависимости от результата:</p>
64 </ul><p>Использовать операторы сравнения можно с помощью команды test. Команда test принимает два значения и оператор сравнения и возвращает 1 или 0 в зависимости от результата:</p>
65 test "hello" = "hello" echo $? # Выведет 0 (true), так как строки одинаковые test "hello" != "world" echo $? # Выведет 0 (true), так как строки различаются<p>Помимо команды test, операторы сравнения можно использовать квадратных скобках [ ]. Но для этого нам понадобится разобраться, как работать с ветвлениями.</p>
65 test "hello" = "hello" echo $? # Выведет 0 (true), так как строки одинаковые test "hello" != "world" echo $? # Выведет 0 (true), так как строки различаются<p>Помимо команды test, операторы сравнения можно использовать квадратных скобках [ ]. Но для этого нам понадобится разобраться, как работать с ветвлениями.</p>
66 <p>Ветвления if-then-else позволяют проверить условие и выполнить один набор команд, если условие истинно, и другой набор команд, если условие ложно. Это выглядит так:</p>
66 <p>Ветвления if-then-else позволяют проверить условие и выполнить один набор команд, если условие истинно, и другой набор команд, если условие ложно. Это выглядит так:</p>
67 if [ условие ]; then # Команды, которые нужно выполнить, если условие истинно else # Команды, которые нужно выполнить, если условие ложно fi<p><strong>Обратите внимание</strong>: открывающую и закрывающую квадратные скобки нужно отделять от операндов пробелами.</p>
67 if [ условие ]; then # Команды, которые нужно выполнить, если условие истинно else # Команды, которые нужно выполнить, если условие ложно fi<p><strong>Обратите внимание</strong>: открывающую и закрывающую квадратные скобки нужно отделять от операндов пробелами.</p>
68 <p>А если в паре с основным условием нужно проверить дополнительное, используют конструкцию elif:</p>
68 <p>А если в паре с основным условием нужно проверить дополнительное, используют конструкцию elif:</p>
69 if [ условие_1 ]; then # Команды, которые нужно выполнить, если условие_1 истинно elif [ условие_2 ]; then # Команды, которые нужно выполнить, если условие_2 истинно else # Команды, которые нужно выполнить, если все условия ложны fi<p>Существует и более короткая форма записи условной конструкции - if-then. Её используют, когда нужно проверить только одно условие:</p>
69 if [ условие_1 ]; then # Команды, которые нужно выполнить, если условие_1 истинно elif [ условие_2 ]; then # Команды, которые нужно выполнить, если условие_2 истинно else # Команды, которые нужно выполнить, если все условия ложны fi<p>Существует и более короткая форма записи условной конструкции - if-then. Её используют, когда нужно проверить только одно условие:</p>
70 if [ условие ]; then # Команды, которые нужно выполнить fi<p>В этом случае команды будут выполнены, только если условие истинно.</p>
70 if [ условие ]; then # Команды, которые нужно выполнить fi<p>В этом случае команды будут выполнены, только если условие истинно.</p>
71 <p>Для наглядности давайте напишем скрипт, который проверяет правильность введённого пароля:</p>
71 <p>Для наглядности давайте напишем скрипт, который проверяет правильность введённого пароля:</p>
72 #!/bin/bash # Задаём значение переменной password password="14pomTEr" # Запрашиваем ввод пароля у пользователя и сохраняем полученное значение в переменную user_input read -p "Enter the password: " user_input # Сравниваем значение переменной password с введённым пользователем значением user_input if [ "$password" = "$user_input" ]; then # Если пароли совпадают, выводим сообщение о том, что пароль введён правильно echo "Password accepted" else # Если пароли не совпадают, выводим сообщение о том, что пароль введён неправильно echo "Wrong password" fi<p>Кроме того, в Bash есть логические операторы &amp; &amp; (логическое И) и <strong>||</strong>(логическое ИЛИ), которые позволяют комбинировать несколько условий и возвращать соответствующее булево значение.</p>
72 #!/bin/bash # Задаём значение переменной password password="14pomTEr" # Запрашиваем ввод пароля у пользователя и сохраняем полученное значение в переменную user_input read -p "Enter the password: " user_input # Сравниваем значение переменной password с введённым пользователем значением user_input if [ "$password" = "$user_input" ]; then # Если пароли совпадают, выводим сообщение о том, что пароль введён правильно echo "Password accepted" else # Если пароли не совпадают, выводим сообщение о том, что пароль введён неправильно echo "Wrong password" fi<p>Кроме того, в Bash есть логические операторы &amp; &amp; (логическое И) и <strong>||</strong>(логическое ИЛИ), которые позволяют комбинировать несколько условий и возвращать соответствующее булево значение.</p>
73 <p>Например, вот как будет выглядеть наша программа, если мы добавим проверку логина:</p>
73 <p>Например, вот как будет выглядеть наша программа, если мы добавим проверку логина:</p>
74 #!/bin/bash username="OlgaBelova94" # Устанавливаем переменную с именем пользователя password="14pomTEr" read -p "Enter your username: " user_input_username # Запрашиваем имя пользователя read -p "Enter the password: " user_input_username # Запрашиваем пароль echo "Enter the password: " read user_input_password # Запрашиваем пароль if [ "$username" == "$user_input_username" ] &amp;&amp; [ "$password" == "$user_input_password" ]; then echo "Password accepted" else echo "Wrong username or password" # Уточняем, что именно было неверно fi<p>Здесь мы получим значение true и сообщение "Password accepted", только если будут выполнены оба условия.</p>
74 #!/bin/bash username="OlgaBelova94" # Устанавливаем переменную с именем пользователя password="14pomTEr" read -p "Enter your username: " user_input_username # Запрашиваем имя пользователя read -p "Enter the password: " user_input_username # Запрашиваем пароль echo "Enter the password: " read user_input_password # Запрашиваем пароль if [ "$username" == "$user_input_username" ] &amp;&amp; [ "$password" == "$user_input_password" ]; then echo "Password accepted" else echo "Wrong username or password" # Уточняем, что именно было неверно fi<p>Здесь мы получим значение true и сообщение "Password accepted", только если будут выполнены оба условия.</p>
75 <p>Как и в большинстве языков программирования, в Bash есть циклы. Они бывают двух видов:</p>
75 <p>Как и в большинстве языков программирования, в Bash есть циклы. Они бывают двух видов:</p>
76 <ul><li>for - когда количество итераций заранее известно.</li>
76 <ul><li>for - когда количество итераций заранее известно.</li>
77 <li>while - когда количество итераций заранее не известно.</li>
77 <li>while - когда количество итераций заранее не известно.</li>
78 </ul><p>Вот как выглядит сигнатура цикла for:</p>
78 </ul><p>Вот как выглядит сигнатура цикла for:</p>
79 for переменная цикла in элемент1 элемент2 ... элементN do # Команды, которые будут выполняться в цикле done<p>Количество итераций (часть между in и do) можно указать простым перечислением элементов:</p>
79 for переменная цикла in элемент1 элемент2 ... элементN do # Команды, которые будут выполняться в цикле done<p>Количество итераций (часть между in и do) можно указать простым перечислением элементов:</p>
80 for fruit in apple banana cherry do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry<p>Можно перебрать элементы массива:</p>
80 for fruit in apple banana cherry do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry<p>Можно перебрать элементы массива:</p>
81 my_array=("apple" "banana" "orange") for fruit in "${my_array[@]}" do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry<p>Для явного указания нужного количества итераций используют арифметические выражения:</p>
81 my_array=("apple" "banana" "orange") for fruit in "${my_array[@]}" do echo "I like $fruit" done # Будет выведено: # I like apple # I like banana # I like cherry<p>Для явного указания нужного количества итераций используют арифметические выражения:</p>
82 for ((i=0; i&lt;5; i++)) do echo "Iteration number $i" done # Будет выведено: # Iteration number 0 # Iteration number 1 # Iteration number 2 # Iteration number 3 # Iteration number 4<p>А вот так выглядит сигнатура цикла while:</p>
82 for ((i=0; i&lt;5; i++)) do echo "Iteration number $i" done # Будет выведено: # Iteration number 0 # Iteration number 1 # Iteration number 2 # Iteration number 3 # Iteration number 4<p>А вот так выглядит сигнатура цикла while:</p>
83 while [ условие ] do # Команды, которые будут выполняться в цикле done<p><strong>Условие</strong><strong>(condition)</strong> - это выражение, результат которого является логическим значением true или false. Команды внутри цикла будут выполняться до тех пор, пока condition возвращает true.</p>
83 while [ условие ] do # Команды, которые будут выполняться в цикле done<p><strong>Условие</strong><strong>(condition)</strong> - это выражение, результат которого является логическим значением true или false. Команды внутри цикла будут выполняться до тех пор, пока condition возвращает true.</p>
84 <p>Давайте усовершенствуем нашу программу проверки пароля так, чтобы она запрашивала его до тех пор, пока пользователь не введёт верный:</p>
84 <p>Давайте усовершенствуем нашу программу проверки пароля так, чтобы она запрашивала его до тех пор, пока пользователь не введёт верный:</p>
85 #!/bin/bash password="14pomTEr" user_input="" while [ "$user_input" != "$password" ] do read -p "Enter the password: " user_input echo "Wrong password, login denied" done echo "Password accepted, login allowed"<p><strong>Что здесь происходит.</strong>В этом примере цикл while запрашивает пароль у пользователя, а потом проверяет его на совпадение с правильным с помощью оператора ["$user_input" != "$password"]. А дальше происходит следующее:</p>
85 #!/bin/bash password="14pomTEr" user_input="" while [ "$user_input" != "$password" ] do read -p "Enter the password: " user_input echo "Wrong password, login denied" done echo "Password accepted, login allowed"<p><strong>Что здесь происходит.</strong>В этом примере цикл while запрашивает пароль у пользователя, а потом проверяет его на совпадение с правильным с помощью оператора ["$user_input" != "$password"]. А дальше происходит следующее:</p>
86 <ul><li>Если пароль неверный, программа выводит соответствующее сообщение, а цикл продолжается.</li>
86 <ul><li>Если пароль неверный, программа выводит соответствующее сообщение, а цикл продолжается.</li>
87 <li>Если пароль верный, программа выводит сообщение о принятии пароля и завершает выполнение.</li>
87 <li>Если пароль верный, программа выводит сообщение о принятии пароля и завершает выполнение.</li>
88 </ul><p>Функции на языке Bash имеют такой вид:</p>
88 </ul><p>Функции на языке Bash имеют такой вид:</p>
89 имя_функции (аргументы) { # Тело функции }<p>Например, вот как выглядит простая функция без аргументов:</p>
89 имя_функции (аргументы) { # Тело функции }<p>Например, вот как выглядит простая функция без аргументов:</p>
90 say_hello () { # Создаём функцию echo hello } say_hello # Вызываем функцию, будет выведено "hello"<p>А вот как выглядит функция, которая принимает аргументы:</p>
90 say_hello () { # Создаём функцию echo hello } say_hello # Вызываем функцию, будет выведено "hello"<p>А вот как выглядит функция, которая принимает аргументы:</p>
91 repeat_text () { local text=$1 local reps=$2 for (( i=0; i&lt;$reps; i++ )); do echo "$text" done } repeat_text "hello" 3<p><strong>Что здесь происходит:</strong></p>
91 repeat_text () { local text=$1 local reps=$2 for (( i=0; i&lt;$reps; i++ )); do echo "$text" done } repeat_text "hello" 3<p><strong>Что здесь происходит:</strong></p>
92 <ul><li>С помощью ключевого слова local мы создали две локальные переменные - то есть переменные, существующие только внутри функции.</li>
92 <ul><li>С помощью ключевого слова local мы создали две локальные переменные - то есть переменные, существующие только внутри функции.</li>
93 <li>В одну из них поместили текст, а во вторую - количество повторов.</li>
93 <li>В одну из них поместили текст, а во вторую - количество повторов.</li>
94 - <li>Затем создали цикл, который берёт текст из первой переменной и повторяет его столько раз, сколько раз указано во второй.</li>
94 + <li>Затем создали цикл, который брёт текст из первой переменной и повторяет его столько раз, сколько раз указано во второй.</li>
95 <li>Вызвали функцию, передав ей значения hello и 3 - то есть приказали повторить слово "hello" три раза.</li>
95 <li>Вызвали функцию, передав ей значения hello и 3 - то есть приказали повторить слово "hello" три раза.</li>
96 </ul><p>Настало время применить знания на практике - напишем скрипт для автоматической очистки кэша браузера и DNS.</p>
96 </ul><p>Настало время применить знания на практике - напишем скрипт для автоматической очистки кэша браузера и DNS.</p>
97 <p>Состоять наш скрипт будет из трёх функций: первая - для очистки кэша браузера, вторая - для очистки кэша DNS, а в третью завернём небольшое меню для выбора нужного действия.</p>
97 <p>Состоять наш скрипт будет из трёх функций: первая - для очистки кэша браузера, вторая - для очистки кэша DNS, а в третью завернём небольшое меню для выбора нужного действия.</p>
98 <p>Начинаем, как водится, с шебанга - специальной строки, которая говорит компьютеру, с помощью какой программы нужно запускать скрипт. Так как мы хотим использовать bash, которая лежит в папке /bin, шебанг будет выглядеть так:</p>
98 <p>Начинаем, как водится, с шебанга - специальной строки, которая говорит компьютеру, с помощью какой программы нужно запускать скрипт. Так как мы хотим использовать bash, которая лежит в папке /bin, шебанг будет выглядеть так:</p>
99 #!/bin/bash<p>Теперь напишем функцию, которая будет очищать браузерный кэш. В комментариях - разбор синтаксиса.</p>
99 #!/bin/bash<p>Теперь напишем функцию, которая будет очищать браузерный кэш. В комментариях - разбор синтаксиса.</p>
100 clear_browser_cache() { # Проверяем, какой браузер установлен на компьютере if command -v google-chrome &gt;/dev/null 2&gt;&amp;1; then # Если установлен Google Chrome, очищаем кэш браузера google-chrome --user-data-dir=$(mktemp -d) --disable-extensions --disable-plugins --disable-geolocation --no-default-browser-check --no-first-run --noerrdialogs --disable-session-crashed-bubble --disable-infobars --disk-cache-size=0 --media-cache-size=0 # Далее проверяем, установлен ли Firefox elif command -v firefox &gt;/dev/null 2&gt;&amp;1; then # Если установлен Firefox, очищаем кэш браузера firefox --new-instance --safe-mode # Если браузер не установлен, выводим сообщение об ошибке else echo "Error: no supported browser found" fi }<p>Далее напишем функцию для очистки кэша DNS.</p>
100 clear_browser_cache() { # Проверяем, какой браузер установлен на компьютере if command -v google-chrome &gt;/dev/null 2&gt;&amp;1; then # Если установлен Google Chrome, очищаем кэш браузера google-chrome --user-data-dir=$(mktemp -d) --disable-extensions --disable-plugins --disable-geolocation --no-default-browser-check --no-first-run --noerrdialogs --disable-session-crashed-bubble --disable-infobars --disk-cache-size=0 --media-cache-size=0 # Далее проверяем, установлен ли Firefox elif command -v firefox &gt;/dev/null 2&gt;&amp;1; then # Если установлен Firefox, очищаем кэш браузера firefox --new-instance --safe-mode # Если браузер не установлен, выводим сообщение об ошибке else echo "Error: no supported browser found" fi }<p>Далее напишем функцию для очистки кэша DNS.</p>
101 clear_dns_cache() { # Проверяем, какая операционная система установлена на компьютере # Если установлена Linux, очищаем кэш DNS if [[ "$OSTYPE" == "linux-gnu"* ]]; then sudo systemd-resolve --flush-caches # Если установлена macOS, очищаем кэш DNS elif [[ "$OSTYPE" == "darwin"* ]]; then sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder # Если операционная система не поддерживается, выводим сообщение об ошибке else echo "Error: unsupported operating system" fi }<p>Ну а теперь дело за малым. Напишем небольшое меню, чтобы пользователь мог выбрать, кэш браузера или кэш DNS нужно очистить.</p>
101 clear_dns_cache() { # Проверяем, какая операционная система установлена на компьютере # Если установлена Linux, очищаем кэш DNS if [[ "$OSTYPE" == "linux-gnu"* ]]; then sudo systemd-resolve --flush-caches # Если установлена macOS, очищаем кэш DNS elif [[ "$OSTYPE" == "darwin"* ]]; then sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder # Если операционная система не поддерживается, выводим сообщение об ошибке else echo "Error: unsupported operating system" fi }<p>Ну а теперь дело за малым. Напишем небольшое меню, чтобы пользователь мог выбрать, кэш браузера или кэш DNS нужно очистить.</p>
102 # Сначала выведем варианты clear_cache() { echo "Select cache to clear:" echo "1. Browser cache" echo "2. DNS cache" # Запросим у пользователя номер выбранного пункта меню read -p "Enter your choice: " choice # В зависимости от выбранного пункта меню вызываем соответствующую функцию для очистки кэша if [ "$choice" -eq 1 ]; then clear_browser_cache elif [ "$choice" -eq 2 ]; then clear_dns_cache else echo "Invalid choice" fi }<p>Вуаля! Наш скрипт готов. Чтобы его запустить, нам нужно лишь вызвать функцию clear_cache:</p>
102 # Сначала выведем варианты clear_cache() { echo "Select cache to clear:" echo "1. Browser cache" echo "2. DNS cache" # Запросим у пользователя номер выбранного пункта меню read -p "Enter your choice: " choice # В зависимости от выбранного пункта меню вызываем соответствующую функцию для очистки кэша if [ "$choice" -eq 1 ]; then clear_browser_cache elif [ "$choice" -eq 2 ]; then clear_dns_cache else echo "Invalid choice" fi }<p>Вуаля! Наш скрипт готов. Чтобы его запустить, нам нужно лишь вызвать функцию clear_cache:</p>
103 clear_cache<p>В теории можно сделать скрипт и ещё лучше - например, добавить больше браузеров, реализовать проверку прав администратора и другие фишки. Но на сегодня, пожалуй, достаточно.</p>
103 clear_cache<p>В теории можно сделать скрипт и ещё лучше - например, добавить больше браузеров, реализовать проверку прав администратора и другие фишки. Но на сегодня, пожалуй, достаточно.</p>
104 <p>Вот вы и освоили основные элементы языка Bash и даже написали свой первый скрипт - поздравляем! Если хотите потренироваться в решении задачек на Bash, можете заглянуть в этот<a>онлайн-тренажёр</a> - он бесплатный и довольно гуманный по отношению к новичкам.</p>
104 <p>Вот вы и освоили основные элементы языка Bash и даже написали свой первый скрипт - поздравляем! Если хотите потренироваться в решении задачек на Bash, можете заглянуть в этот<a>онлайн-тренажёр</a> - он бесплатный и довольно гуманный по отношению к новичкам.</p>
105 <p>Ещё можно посмотреть на проект<a>TryBash</a>, где вся базовая теория дана в виде коротких интерактивных уроков. Там же можно забрать удобную шпаргалку с основными командами Bash, чтобы постоянно не бегать в Google во время обучения и экспериментов.</p>
105 <p>Ещё можно посмотреть на проект<a>TryBash</a>, где вся базовая теория дана в виде коротких интерактивных уроков. Там же можно забрать удобную шпаргалку с основными командами Bash, чтобы постоянно не бегать в Google во время обучения и экспериментов.</p>
106 <p>А если чувствуете, что хотите знать больше, можете почитать Advanced Bash-Scripting Guide ("Расширенный гайд по написанию скриптов на Bash") - он на английском, но есть<a>хороший любительский перевод</a>. Ну, или приходите на курс Skillbox "<a>Администрирование ОС Linux</a>" - там тоже много всего полезного :)</p>
106 <p>А если чувствуете, что хотите знать больше, можете почитать Advanced Bash-Scripting Guide ("Расширенный гайд по написанию скриптов на Bash") - он на английском, но есть<a>хороший любительский перевод</a>. Ну, или приходите на курс Skillbox "<a>Администрирование ОС Linux</a>" - там тоже много всего полезного :)</p>