Shell-скриптинг – это важный компонент автоматизации процессов в Linux. С помощью сценариев вы можете записать последовательность команд в файл, а затем выполнить их.
Это сэкономит ваше время, так как вам не нужно будет из раза в раз писать одни и те же команды. Вы можете без проблем выполнять какие-то повседневные задачи и даже планировать их автоматическое выполнение.
Кроме того, вы можете настроить некоторые сценарии так, чтобы они выполнялись при запуске, например, чтобы при запуске нового сеанса на экране отображалось определенное сообщение или устанавливались какие-то переменные среды.
Вариантов использования сценариев довольно много, так что давайте рассмотрим их более подробно.
Из этой статьи вы узнаете:
- что такое bash-оболочка
- что такое bash-сценарий и как его определить
- как создать свой первый bash-сценарий и выполнить его
- как выглядит базовый синтаксис сценариев оболочки
- как просмотреть запланированные сценарии системы
- как автоматизировать сценарии путем планирования cron-заданий
Лучший способ изучить что-то – испробовать это на практике. Я настоятельно рекомендую воспользоваться Replit. С его помощью вы сможете быстро получить доступ к запущенной оболочке Linux.
Введение в понятие Bash-оболочки
Работа командной строки Linux осуществляется программой под названием оболочка. Со временем эта программа претерпела различные изменения, дабы приспособиться к различным ситуациям.
Разные пользователи могут использовать разные оболочки. Однако большая часть пользователей предпочитают оставлять текущую оболочку по умолчанию. Для большинства дистрибутивов Linux оболочка по умолчанию – это GNU Bourne-Again Shell (Bash). Преемником bash стала оболочка Bourne (sh).
Когда вы запускаете оболочку первый раз, она использует загрузочный сценарий, который расположен в .bashrc или .bash_profile. С помощью этого сценария вы можете настроить то, как оболочка будет себя вести.
Когда оболочка используется в диалоговом режиме, она отображает на экране значок $, что значит, что она ждет команды от пользователя. Этот значок называется приглашением командной строки.
[username@host ~]$
Если оболочка запущена с правами администратора, то значок приглашения меняется на #. А приглашение оболочки для привилегированного пользователя выглядит так:
[root@host ~]#
Bash – это довольно мощный инструмент, так как он может упростить определенные операции, выполнение которых с помощью GUI (графический пользовательский интерфейс) будет не таким эффективным. Также не стоит забывать, что большая часть серверов не имеют GUI, так что лучше всего научиться пользоваться возможностями CLI (интерфейс командной строки).
Что такое Bash-сценарий?
Bash-сценарий – это набор команд, записанных в файле. Программа-оболочка (bash) считывает эти команды и выполняет их. Сценарий выполняется строчка за строчкой.
Например, вы можете перейти в какой-то каталог, создать там папку и запустить в ней какой-то процесс с помощью командной строки.
Вы можете сохранить команды в bash-сценарии и, запуская его, выполнять одну и ту же последовательность действий. Запускать сценарий можно любое количество раз.
Как определить Bash-сценарий?
Расширение файла (.sh)
Согласно соглашениям о присвоении имен, наименования bash-сценариев должны оканчиваться на .sh. При этом bash-сценарии будут отлично работать и без этого расширения.
Сценарии начинаются с шебанга
Помимо этого, сценарии обозначаются с помощью шебанга. Шебанг – это комбинация # (bash) и ! (восклицательный знак), после которых следует путь к оболочке bash. Это должна быть первая сточка сценария. Шебанг указывает оболочке, что сценарий необходимо выполнить в bash-оболочке. Шебанг - это ни что иное, как абсолютный путь к интерпретатору bash.
Ниже приведен пример выражения с шебангом:
#! /bin/bash
Путь к bash-программе может отличаться. Чуть позже мы посмотрим, как его можно определить.
Права исполнения
Сценарии имеют права исполнения для пользователей, которые их выполняют.
Право исполнения обозначается символом x. В примере ниже мой пользователь имеет права rwx (read, write, execute – чтение, запись, выполнение) для файла test_script.sh.
Цвет файла
Исполняемые сценарии выделяются цветом, что выделяет их на фоне остальных файлов и папок.
В данном случае сценарии с правами исполнения выделены зеленым цветом.
Как создать свой первый bash-сценарий
Давайте создадим простой сценарий в bash, который будет выводить Hello World.
Создаем файл с названием hello_world.sh
touch hello_world.sh
Находим путь к bash-оболочке
which bash
В данном случае этот путь выглядит так: /usr/bin/bash. И я добавляю его к шебангу.
Пишем команду
Мы хотим отобразить надпись «Hello world» в консоли.
Наш сценарий будет выглядеть примерно так:
#! /usr/bin/bash
echo "Hello World"
Редактируем файл hello_world.sh с помощью текстового редактора (на ваш выбор) и добавляем в него строчки, приведенные выше.
Указываем права исполнения для пользователя
Меняем права доступа к файлу и разрешаем выполнение сценария с помощью следующей команды:
chmod u+x hello_world.sh
chmod меняет существующие права на файл для конкретного пользователя, и мы добавляем +x к пользователю u.
Запускаем сценарий
Мы можем запустить сценарий одним из следующих способов:
./hello_world.sh
bash hello_world.sh.
Вот результат:
Два способа запустить сценарий
Базовый синтаксис bash-сценария
Как и в случае с любым другим языком программирования, при написании bash-сценария необходимо следовать определенному набору правил для того, чтобы создать программу, которую сможет понять компьютер.
Как определить переменные
Мы можем определить переменную с помощью следующего синтаксиса: variable_name=value. А для того, чтобы получить значение переменной, мы должны добавить перед ней символ $.
#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name
Tux – это имя талисмана Linux, а именно пингвина.
Привет, я - Tux.
Арифметические выражения
Ниже приведен список операторов для математических вычислений, которые поддерживаются bash:
Оператор |
Значение оператора |
+ |
сложение |
- |
вычитание |
* |
умножение |
/ |
деление |
** |
возведение в степень |
% |
абсолютное значение |
Давайте запустим несколько примеров.
Обратите внимание на пробелы, они – часть синтаксиса
Кроме того, вы можете вычислить какое-то числовое выражение и сохранить его значение в переменной с помощью следующего синтаксиса:
var=$((expression))
Давайте попробуем на примере.
#!/bin/bash
var=$((3+9))
echo $var
Методы, представленные выше, неправильно вычисляют дроби, они их округляют.
Для вычислений в десятичных числах мы можем использовать команду bc. С ее помощью мы можем получить вывод с точностью до определенного количества знаков. bc (Bash Calculator) – это калькулятор командной строки, который поддерживает вычисления с десятичными числами до определённого количества знаков после запятой.
echo "scale=2;22/7" | bc
Здесь scale определяет количество знаков после запятой выходного значения.
Получение результата с точностью до двух знаков после запятой
Как считывать пользовательский ввод
В некоторых случаях вам может потребоваться считать пользовательский ввод и выполнить соответствующие действия.
В bash мы можем получать пользовательский ввод с помощью команды read.
read variable_name
Чтобы пользователь получил сообщение в качестве предложения к вводу, добавьте флаг -p.
read -p "Enter your age" variable_name
Пример:
#!/bin/bash
echo "Enter a numner"
read a
echo "Enter a numner"
read b
var=$((a+b))
echo $var
Логические операторы для сравнения числовых значений
Сравнения нужны для проверки утверждений на истинность. Для сравнения двух утверждений мы можем использовать следующие операторы:
Оператор |
Синтаксис |
Описание |
Равно |
num1 -eq num2 |
num1 равен num2? |
Больше или равно |
num1 -ge num2 |
num1 больше или равен num2? |
Больше |
num1 -gt num2 |
num1 больше num2? |
Меньше или равно |
num1 -le num2 |
num1 меньше или равен num2? |
Меньше |
num1 -lt num2 |
num1 меньше num2? |
Не равно |
num1 -ne num2 |
num1 не равен num2? |
Синтаксис:
if [ conditions ]
then
commands
fi
Пример:
Давайте сравним два числа и определим, как они соотносятся:
read x
read y
if [ $x -gt $y ]
then
echo X is greater than Y
elif [ $x -lt $y ]
then
echo X is less than Y
elif [ $x -eq $y ]
then
echo X is equal to Y
fi
Результат:
Условные операторы (принятие решений)
Условия – это выражения, которые можно оценить логическими значениями (true или false). Для проверки условий мы можем использовать следующие конструкции: if, if-else, if-elif-else, а также вложенные условия.
Вот так выглядят условные операторы:
- if...then...fi
- if...then...else...fi
- if..elif..else..fi
- if..then..else..if..then..fi..fi.. (вложенные условия)
Синтаксис:
if [[ condition ]]
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi
Для того, чтобы создавать более содержательные сравнения, мы можем использовать операторы И (-a) и ИЛИ (-o).
Ниже приведено утверждение, и его можно перевести как «если a больше 40, а b меньше 6».
if [ $a -gt 40 -a $b -lt 6 ]
Пример: давайте определим тип треугольника по считанным длинам его сторон.
read a
read b
read c
if [ $a == $b -a $b == $c -a $a == $c ]
then
echo EQUILATERAL
elif [ $a == $b -o $b == $c -o $a == $c ]
then
echo ISOSCELES
else
echo SCALENE
fi
Результат:
Тестовый пример №1
Тестовый пример №2
Тестовый пример №3
Циклы и обходы
С помощью циклов мы можем выполнять операторы определенное количество раз.
Циклы по числам:
Пример ниже демонстрирует цикл, который повториться 5 раз.
#!/bin/bash
for i in {1..5}
do
echo $i
done
Циклы по строками:
Кроме того, мы можем проходить циклом по строкам.
#!/bin/bash
for X in cyan magenta yellow
do
echo $X
done
Цикл while:
Цикл while проверяет условие и повторяется до тех пор, пока условие не станет истинным. Для управления выполнением цикла мы должны ввести специальный оператор, который будет увеличивать счетчик.
В примере ниже этим специальным оператором является (( i += 1 )). Он увеличивает значение переменной i.
Пример:
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done
Чтение файлов
Предположим, что у нас есть файл sample_file.txt, и он выглядит так:
Мы можем читать файл строчка за строчкой и выводить результат на экран.
#!/bin/bash
LINE=1
while read -r CURRENT_LINE
do
echo "$LINE: $CURRENT_LINE"
((LINE++))
done < “sample_file.txt”
Результат:
Строки печатаются вместе с номерами строк
Как выполнять команды с помощью обратных кавычек
Если сценарий предполагает вывод сложной команды, мы можем заключить оператор в обратные кавычки.
Синтаксис:
var= ` commands `
Пример: предположим, что мы хотим вывести список точек подключения так, чтобы в их названии присутствовало tmpfs. Мы можем выполнить вот такой оператор: df -h | grep tmpfs.
Для того, чтобы добавить его в bash-сценарий, нам необходимо заключить его в обратные кавычки.
#!/bin/bash
var=`df -h | grep tmpfs`
echo $var
Результат:
Как получить аргументы для сценария с помощью командной строки
Мы можем передавать аргументы сценарию непосредственно во время его исполнения.
Символы $@ обозначают позицию параметра, начиная с единицы.
#!/bin/bash
for x in $@
do
echo "Entered arg is $x"
done
Запустим его:
./script arg1 arg2
Как автоматизировать сценарии путем планирования cron-заданий
Cron – это планировщик заданий, присущий Unix-подобным системам. Вы можете составить график выполнения заданий, чтобы они выполнялись ежедневно, еженедельно, ежемесячно или в какое-то определенное время дня. Именно cron-задания лежат в основе автоматизации в Linux.
Ниже приведен синтаксис для планирования cron-заданий:
# Cron job example { // пример планирования cron-задания }
* * * * * sh /path/to/script.sh
В данном случае звездочка (*) обозначает минуты, часы, дни, месяцы и дни недели соответственно.
Ниже приведены несколько примеров планирования cron-заданий.
ГРАФИК |
ПОЯСНЕНИЕ |
5 0 * 8 * |
В 00:05 в августе |
5 4 * * 6 |
В 04:05 в субботу |
0 22 * * 1-5 |
В 22:00 каждый день с понедельника по пятницу |
Как проверить сценарии, которые уже есть в системе
С помощью команды crontab
Команда crontab -l перечисляет все уже запланированные сценарии для конкретного пользователя.
Мои запланированные сценарии
С помощью команды find
Команда find помогает находить файлы, исходя из заданных шаблонов. Так как большая часть сценариев заканчивается на .sh, то мы можем найти сценарий примерно таким образом:
find . -type f -name "*.sh"
где:
- точка (.) обозначает текущий каталог. Вы можете изменить этот путь.
- -type f указывает на тип файла, который мы ищем, - текстовый.
- *.sh указывает, что файл должен заканчиваться на .sh.
Заключение
В этой статье мы рассмотрели основы shell-скриптинга. Мы изучили синтаксис и разобрали примеры, которые могут помочь вам писать более серьезные программы.