Написание скриптов в Linux Bash
Когда вы часто используете одни и те же команды в терминале Linux, самое время подумать о создании скриптов для автоматизации повседневных рутинных задач. На самом простом уровне shell скриптинг — это просто набор команд, помещенных в файл, который при выполнении в виде программы будет выполнять каждую отдельную команду по порядку.
Пример выполнения нескольких команд в оболочке:
timeweb@localhost:~$ date;who;uptime
Wed Jan 19 01:53:56 UTC 2022
timeweb console Nov 30 22:49
01:53:56 up 19 days, 9:07, 1 user, load average: 0.03, 0.05, 0.05
Чтобы создать скрипт из этих команд, просто поместите их в файл и сделайте его исполняемым:
timeweb@localhost:~$ echo 'date;who;uptime' > script.sh
timeweb@localhost:~$ chmod +x ./script.sh
timeweb@localhost:~$ ./script.sh
Wed Jan 19 01:55:30 UTC 2022
timeweb console Nov 30 22:49
01:55:30 up 19 days, 9:08, 1 user, load average: 0.05, 0.05, 0.05
Shell скриптинг может предоставлять мощные функции. В дополнение ко всем функциям, которая предоставляет интерактивная оболочка (т.е. переменные, псевдонимы, функции), системные администраторы также могут использовать функции программирования, такие как операторы if, циклы while и for.
Основы shell скриптинга
Чтобы создать сценарий командной оболочки, выполните следующие действия:
- Используйте текстовый редактор для создания файла с командами, которые вы хотите выполнить;
- Поместите следующую строку в начало файла, чтобы указать, что скрипт должен выполняться в командной оболочке bash.
chmod +x имя_файла
Первая строка скрипта должна содержать символы # ! , которые сообщают системе путь к исполняемому файлу оболочки bash. Обычно символ знака # используется для комментария строки, но когда он помещается в начале первой строки и ему предшествует символ восклицательного знака ! , то он используется для указания системе, какой исполняемый файл использовать для запуска программы.
В следующем примере рассмотрим скрипт, который создаст отчет об использовании дискового пространства в каталоге /usr/share/doc.
timeweb@localhost:~/test$ cat report.sh
#!/bin/bash
cd /usr/share/doc
echo "Document directory usage report" > /tmp/report
date >> /tmp/report
pwd >> /tmp/report
du -sh . >> /tmp/report
timeweb@localhost:~/test$ chmod +x report.sh
timeweb@localhost:~/test$ ./report.sh
timeweb@localhost:~/test$ cat /tmp/report
Document directory usage report
Wed Jan 19 06:41:17 UTC 2022
/usr/share/doc
6.6M .
Расположение скрипта
Обратите внимание, что для выполнения скрипта в предыдущем примере перед именем скрипта была помещена комбинация символов ./, указывающий текущий каталог. Хотя этот метод всегда можно использовать для запуска скрипта, рассмотрите возможность размещения скрипта в месте, указанном переменной PATH.
Точное значение переменной PATH будет варьироваться в зависимости от используемого дистрибутива Linux, а также от индивидуальных настроек, типичная переменная PATH будет включать следующие каталоги:
timeweb@localhost:~$ echo $PATH
/home/timeweb/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:
/usr/games:/usr/local/games
С правами администратора скрипт может быть размещен в любом из каталогов, перечисленных в переменной PATH. Однако идеальным местом для скриптов, предназначенных для совместного использования обычными пользователями, будет каталог /usr/local/bin. А для скриптов, предназначенных для выполнения администраторами, поместите в каталог /usr/local/sbin.
Обычные пользователи не имеют прав размещать файлы в этих каталогах. Для собственных скриптов пользователя идеальным местом для размещения является его каталог /home/USER/bin, где USER — это имя текущей учетной записи пользователя. Например, системный администратор должен размещать скрипты у себя в каталоге /home/sysadmin/bin.
Разместив скрипты в этих каталогах, их будет легче найти, а также проще выполнить.
Разрешения скрипта
Как правило, скрипт должен иметь разрешение как на чтение, так и на выполнение для пользователя, который пытается его выполнить. В предыдущем примере команда chmod +x имя_файла предоставила разрешение на выполнение всем пользователям (предполагалось, что разрешение прав на чтение уже предоставлено всем пользователям).
Если сценарий предназначен для частного использования, рассмотрите возможность предоставления разрешения на выполнение только для пользователя: chmod u+x имя_файла.
Замена команд
Функция оболочки, которая очень полезна при создании скриптов, называется подстановкой команд. Это позволяет сценарию выполнять команду командной оболочки и перенаправлять вывод команды в переменную, вместо отображения вывода в терминале. Например, чтобы зафиксировать дату и время запуска и завершения сценария, используйте следующий синтаксис:
timeweb@localhost:~$
start=`date`
Символы обратной кавычки вокруг данных указывают оболочке выполнить команду и заменить «дату» выводом команды «date». Затем этот вывод присваивается переменной start:
timeweb@localhost:~$
echo $start
Wed Jan 19 02:19:05 UTC 2022
В оболочке bash вы также можете использовать синтаксис $(команда):
timeweb@localhost:~$ end=$(date)
timeweb@localhost:~$ echo $start $end
Wed Jan 19 02:19:05 UTC 2022 Wed Jan 19 02:19:18 UTC 2022
Оба метода выполняют одну и ту же задачу; большинство программистов оболочки bash предпочитают использовать синтаксис $(command), поскольку считают, что его легче читать (обратные кавычки иногда выглядят как одинарные кавычки).
Подстановка команд также может быть использована для вставки выходных данных команды в качестве аргумента другой команды. Например:
timeweb@localhost:~$
echo "Today is $(date)"
Today is Wed Jan 19 02:29:00 UTC 2022
Это может быть полезно, если у вас есть файл, содержащий такие данные, например, имена пользователей, имена каталогов или имена файлов. В следующем примере файл dirs.txt содержит три имени каталога, которые передаются в команду du в качестве аргументов с помощью подстановки команд:
timeweb@localhost:~/test$ cat dirs.txt
/usr/share/doc
/usr/local
/etc/magic
timeweb@localhost:~/test$ du -sh $(cat dirs.txt)
6.6M /usr/share/doc
4.0K /usr/local
4.0K /etc/magic
Хотя замена команд часто используется в командной строке, это также очень мощная функция написания сценариев оболочки. Следующий скрипт демонстрирует использование подстановки команд:
timeweb@localhost:~/test$
cat report2.sh
#!/bin/bash
start=$(date)
cd /usr/share/doc
echo "Document directory usage report" > /tmp/report
du -sh $(cat ~/test/dirs.txt) >> /tmp/report
echo "Start of report: $start" >> /tmp/report
echo "End of report: $(date)" >> /tmp/report
timeweb@localhost:~/test$ ./report2.sh
timeweb@localhost:~/test$ cat /tmp/report
Document directory usage report
6.6M /usr/share/doc
4.0K /usr/local
4.0K /etc/magic
Start of report: Wed Jan 19 06:58:23 UTC 2022
End of report: Wed Jan 19 06:58:23 UTC 2022
Оператор чтения
Оператор чтения может использоваться для сбора информации от пользователя, выполняющего скрипт. Пользователю будет представлен “мигающий курсор”, который будет принимать ввод с клавиатуры и помещать то, что пользователь вводит, в одну или несколько переменных. Основной синтаксис команды чтения таков:
read variable
Например, следующая команда считывает введенные пользователем данные в переменную с именем:
Пользователю было бы полезно знать, какой тип ввода запрашивается. Опция –p для команды read позволяет выдать приглашение:
read –p "Please enter your name: " name
В следующем примере пользовательский ввод используется для определения того, какое имя каталога использовать для выполнения команды du:
#!/bin/bash
read -p "Enter a directory: " dir
start=$(date)
echo "Document directory usage report" > /tmp/report
du -sh $dir >> /tmp/report
echo "Start of report: $start" >> /tmp/report
echo "End of report: $(date)" >> /tmp/report
timeweb@localhost:~/test$ ./report3.sh
Enter a directory: /etc/magic
timeweb@localhost:~/test$ cat /tmp/report
Document directory usage report
4.0K /etc/magic
Start of report: Wed Jan 19 07:03:56 UTC 2022
End of report: Wed Jan 19 07:03:56 UTC 2022