img

Shell-скриптинг для начинающих: как писать Bash-сценарии в Linux

 

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

image-98

Цвет файла

Исполняемые сценарии выделяются цветом, что выделяет их на фоне остальных файлов и папок. 

В данном случае сценарии с правами исполнения выделены зеленым цветом. 

image-99

Как создать свой первый bash-сценарий

Давайте создадим простой сценарий в bash, который будет выводить Hello World

Создаем файл с названием hello_world.sh

touch hello_world.sh

Находим путь к bash-оболочке

which bash

image-100

В данном случае этот путь выглядит так: /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.

Вот результат:

Two ways to run scripts

Два способа запустить сценарий

Базовый синтаксис bash-сценария

Как и в случае с любым другим языком программирования, при написании bash-сценария необходимо следовать определенному набору правил для того, чтобы создать программу, которую сможет понять компьютер. 

Как определить переменные

Мы можем определить переменную с помощью следующего синтаксиса: variable_name=value. А для того, чтобы получить значение переменной, мы должны добавить перед ней символ $.

#!/bin/bash
# A simple variable example
greeting=Hello
name=Tux
echo $greeting $name

image-104

Tux – это имя талисмана Linux, а именно пингвина. 

Hi, I am Tux.

Привет, я - Tux.

Арифметические выражения

Ниже приведен список операторов для математических вычислений, которые поддерживаются bash:

Оператор

Значение оператора

+

сложение

-

вычитание

*

умножение

/

деление

**

возведение в степень

%

абсолютное значение

Давайте запустим несколько примеров.

Note the spaces, these are part of the syntax

Обратите внимание на пробелы, они – часть синтаксиса

Кроме того, вы можете вычислить какое-то числовое выражение и сохранить его значение в переменной с помощью следующего синтаксиса:

var=$((expression))

Давайте попробуем на примере.

#!/bin/bash

var=$((3+9))
echo $var

image-109

Методы, представленные выше, неправильно вычисляют дроби, они их округляют.

Для вычислений в десятичных числах мы можем использовать команду bc. С ее помощью мы можем получить вывод с точностью до определенного количества знаков. bc (Bash Calculator) – это калькулятор командной строки, который поддерживает вычисления с десятичными числами до определённого количества знаков после запятой. 

echo "scale=2;22/7" | bc

Здесь scale определяет количество знаков после запятой выходного значения.

Getting output to 2 decimal places

Получение результата с точностью до двух знаков после запятой

Как считывать пользовательский ввод

В некоторых случаях вам может потребоваться считать пользовательский ввод и выполнить соответствующие действия. 

В 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

image-111

Логические операторы для сравнения числовых значений

Сравнения нужны для проверки утверждений на истинность. Для сравнения двух утверждений мы можем использовать следующие операторы:

Оператор

Синтаксис

Описание

Равно

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

Результат:

image-112

Условные операторы (принятие решений)

Условия – это выражения, которые можно оценить логическими значениями (true или false). Для проверки условий мы можем использовать следующие конструкции: ifif-elseif-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

image-113

 

 

Тестовый пример №2

image-114

Тестовый пример №3

image-115

Циклы и обходы

С помощью циклов мы можем выполнять операторы определенное количество раз.

Циклы по числам:

Пример ниже демонстрирует цикл, который повториться 5 раз.

#!/bin/bash

for i in {1..5}
do
    echo $i
done

Looping-with-numbers

Циклы по строками:

Кроме того, мы можем проходить циклом по строкам.

#!/bin/bash

for X in cyan magenta yellow  
do
echo $X
done

Looping-with-strings

Цикл while:

Цикл while проверяет условие и повторяется до тех пор, пока условие не станет истинным. Для управления выполнением цикла мы должны ввести специальный оператор, который будет увеличивать счетчик. 

В примере ниже этим специальным оператором является (( i += 1 )). Он увеличивает значение переменной i.

Пример:

#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
   echo "$i"
  (( i += 1 ))
done

image-153

Чтение файлов

Предположим, что у нас есть файл sample_file.txt, и он выглядит так:

image-151

Мы можем читать файл строчка за строчкой и выводить результат на экран.

#!/bin/bash

LINE=1

while read -r CURRENT_LINE
do
echo "$LINE: $CURRENT_LINE"
    ((LINE++))
done < “sample_file.txt”

Результат:

Lines with line number printed

Строки печатаются вместе с номерами строк

Как выполнять команды с помощью обратных кавычек

Если сценарий предполагает вывод сложной команды, мы можем заключить оператор в обратные кавычки. 

Синтаксис:

var= ` commands `

Пример: предположим, что мы хотим вывести список точек подключения так, чтобы в их названии присутствовало tmpfs. Мы можем выполнить вот такой оператор: df -h | grep tmpfs.

Для того, чтобы добавить его в bash-сценарий, нам необходимо заключить его в обратные кавычки.

#!/bin/bash

var=`df -h | grep tmpfs`
echo $var

Результат:

image-118

Как получить аргументы для сценария с помощью командной строки

Мы можем передавать аргументы сценарию непосредственно во время его исполнения. 

Символы $@ обозначают позицию параметра, начиная с единицы. 

#!/bin/bash

for x in $@
do
    echo "Entered arg is $x"
done

Запустим его:

./script arg1 arg2

image-155

Как автоматизировать сценарии путем планирования 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 перечисляет все уже запланированные сценарии для конкретного пользователя. 

My scheduled scripts

Мои запланированные сценарии

С помощью команды find

Команда find помогает находить файлы, исходя из заданных шаблонов. Так как большая часть сценариев заканчивается на .sh, то мы можем найти сценарий примерно таким образом:

find . -type f -name "*.sh"

где:

  • точка (.) обозначает текущий каталог. Вы можете изменить этот путь.
  • -type f указывает на тип файла, который мы ищем, - текстовый.  
  • *.sh указывает, что файл должен заканчиваться на .sh.

image-159

Заключение

В этой статье мы рассмотрели основы shell-скриптинга. Мы изучили синтаксис и разобрали примеры, которые могут помочь вам писать более серьезные программы. 

Ссылка
скопирована
Программирование
Скидка 25%
Python Advanced. Продвинутый курс
Освойте асинхронное и метапрограммирование, изучите аннотацию типов и напишите собственное приложение на FastAPI. Улучшите свои навыки Python, чтобы совершить быстрый рост вашего грейда до уровня middle.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
  Хотите разрабатывать игры на Python? Здесь представлен полный обзор лучших библиотек и фреймворков Python, которые вы можете и
img
Если вы хорошо знаете, что такое глубокое обучение, что, скорее всего, не раз слышали такую фразу: «PyTorch против TensorFlow».
img
  Введение Что такое стек и куча? И то, и то область памяти, но с разными механизмами распределения и управления ресурсами памят
img
  Если вы уже давно работаете с SEO, то, возможно, сталкивались с одной из концепций рендеринга - рендеринга на стороне сервера
img
Введение За счет ветвления в Git разработчики могут работать сразу над несколькими функциями или изменениями, не мешая друг друг
img
Управление памятью в операционных системах Введение Управление памятью – это критически важная и при этом довольно сложная задач
Комментарии
ОСЕННИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59