Когда вы часто используете одни и те же команды в терминале 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.
Чтобы создать сценарий командной оболочки, выполните следующие действия:
bash
.#!/bin/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
Например, следующая команда считывает введенные пользователем данные в переменную с именем:
read name
Пользователю было бы полезно знать, какой тип ввода запрашивается. Опция -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