Linux bash script file

Написание скриптов в 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. Обычно символ знака # используется для комментария строки, но когда он помещается в начале первой строки и ему предшествует символ восклицательного знака ! , то он используется для указания системе, какой исполняемый файл использовать для запуска программы.

Читайте также:  What is raw socket in linux

В следующем примере рассмотрим скрипт, который создаст отчет об использовании дискового пространства в каталоге /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 имя_файла предоставила разрешение на выполнение всем пользователям (предполагалось, что разрешение прав на чтение уже предоставлено всем пользователям).

Читайте также:  Astra linux install fly

Если сценарий предназначен для частного использования, рассмотрите возможность предоставления разрешения на выполнение только для пользователя: 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

Например, следующая команда считывает введенные пользователем данные в переменную с именем:

Читайте также:  Check bond interface linux

Пользователю было бы полезно знать, какой тип ввода запрашивается. Опция –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

Источник

Оцените статью
Adblock
detector