Давайте дружить в Телеграме: рассказываем про новые фичи, общаемся в комментах, прислушиваемся к вашим идеям Подписаться

Написание скриптов в Linux Bash

Команда Timeweb Cloud
Команда Timeweb Cloud
Наши инженеры, технические писатели, редакторы и маркетологи
20 января 2022 г.
772
11 минут чтения
Средний рейтинг статьи: 5

Когда вы часто используете одни и те же команды в терминале Linux, самое время подумать о создании скриптов для автоматизации повседневных рутинных задач. На самом простом уровне shell скриптинг - это просто набор команд, помещенных в файл, который при выполнении в виде программы будет выполнять каждую отдельную команду по порядку.

Написание Скриптов В Linux Bash (1)

Пример выполнения нескольких команд в оболочке:

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.
#!/bin/bash
  •   Используйте команду chmod, чтобы сделать файл исполняемым:
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

Зарегистрируйтесь и начните пользоваться
сервисами Timeweb Cloud прямо сейчас

15 лет опыта
Сосредоточьтесь на своей работе: об остальном позаботимся мы
165 000 клиентов
Нам доверяют частные лица и компании, от небольших фирм до корпораций
Поддержка 24/7
100+ специалистов поддержки, готовых помочь в чате, тикете и по телефону