Учебное пособие по написанию сценариев Bash

by moiseevrus

Учебное пособие по написанию сценариев Bash

Оболочка Bash — один из самых мощных компонентов системы Linux , а также одна из самых веских причин для использования Linux. Пользователи могут взаимодействовать с Bash через командную строку и писать сценарии для автоматизации задач.

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

Лучший способ узнать о написании сценариев Bash — это скопировать некоторые из наших примеров в свою систему. Редактируйте их, выполняйте и учитесь по ходу дела. Мы поможем вам пройти все этапы. Давайте начнем!

В этом руководстве по написанию сценариев Bash вы узнаете:

  • Как написать свой первый сценарий Hello World Bash
  • Как передать аргументы сценарию Bash
  • Как использовать глобальные и локальные переменные в Bash
  • Как читать пользовательский ввод
  • Как загружать и читать массивы в Bash
  • Как сравнивать целые числа и строки
  • Как определить типы файлов в Bash
  • Как использовать forwhile, и untilциклы
  • Как использовать функции в Bash
  • Как использовать ifзаявления
  • Как использовать caseзаявления
  • Как использовать кавычки и специальные символы в Bash
  • Как выполнять арифметические вычисления с помощью Bash
  • Как использовать перенаправление Bash
Software Requirements and Linux Command Line Conventions
Category Requirements, Conventions or Software Version Used
System Linux system
Software Bash shell (installed by default)
Other Privileged access to your Linux system as root or via the sudo command.
Conventions # – requires given linux commands to be executed with root privileges either directly as a root user or by use of sudo command
$ – requires given linux commands to be executed as a regular non-privileged user

Сначала вам нужно выяснить, где находится ваш интерпретатор Bash. Введите следующее в командную строку:

$ which bash
/bin/bash
Эта команда показывает, что оболочка Bash хранится в формате /bin/bash. Это вступит в игру на мгновение. Следующее, что вам нужно сделать, это открыть наш любимый текстовый редактор и создать файл с именем hello_world.sh. Мы будем использовать нано для этого шага.
$ nano hello_world.sh
Скопируйте и вставьте в новый файл следующие строки:
#!/bin/bash
# declare STRING variable
STRING="Hello World"
# print variable on a screen
echo $STRING

ПРИМЕЧАНИЕ. Каждый сценарий оболочки bash в этом руководстве начинается с shebang:, #!который не читается как комментарий. Первая строка также является местом, где вы размещаете свой интерпретатор, в данном случае: /bin/bash.Перейдите в каталог, где hello_world.shнаходится ваш скрипт, и сделайте исполняемый файл:
$ chmod +x hello_world.sh 
Теперь вы готовы выполнить свой первый bash-скрипт:
$ ./hello_world.sh 

Вывод, который вы получите, должен быть просто:

Hello World

Простой сценарий резервного копирования bash

При написании сценария Bash вы в основном вводите в него те же самые команды, которые могли бы выполнять непосредственно в комaндной строке. Прекрасным примером этого является следующий скрипт:

#!/bin/bash
tar -czf myhome_directory.tar.gz /home/linuxconfig

Это создаст сжатый tar-файл домашнего каталога для пользователя linuxconfig. Команда tar, которую мы используем в скрипте, может легко выполняться прямо в командной строке.

Итак, в чем преимущество сценария? Что ж, это позволяет нам быстро вызывать эту команду без необходимости запоминать ее или вводить каждый раз. Мы также могли бы легко расширить сценарий позже, чтобы сделать его более сложным.

Переменные в сценариях Bash

В этом примере мы объявляем простую переменную bash $STRINGи выводим ее на экран (stdout) с помощью echoкоманды.

#!/bin/bash
STRING="HELLO WORLD!!!"
echo $STRING

Результат при выполнении скрипта:

$ ./hello_world.sh
HELLO WORLD!!!

Возвращаясь к нашему примеру сценария резервного копирования, давайте используем переменную для имени нашего файла резервной копии и поместим отметку времени в имя файла с помощью dateкоманды.
#!/bin/bash
OF=myhome_directory_$(date +%Y%m%d).tar.gz
tar -czf $OF /home/linuxconfig 

Результат выполнения скрипта:
$ ./backup.sh
$ ls
myhome_directory_$(date +20220209).tar.gz

Теперь, когда мы видим файл, мы можем быстро определить, что резервное копирование было выполнено 9 февраля 2022 года.

Глобальные и локальные переменные

В сценариях Bash глобальная переменная — это переменная, которую можно использовать в любом месте внутри сценария. Локальная переменная будет использоваться только внутри функции, в которой она объявлена. Посмотрите пример ниже, где мы объявляем как глобальную, так и локальную переменную. Мы сделали некоторые комментарии в скрипте, чтобы его было легче воспринимать.

#!/bin/bash
# Define bash global variable
# This variable is global and can be used anywhere in this bash script
VAR="global variable"

function bash {
# Define bash local variable
# This variable is local to bash function only
local VAR="local variable"
echo $VAR
}

echo $VAR
bash
# Note the bash global variable did not change
# "local" is bash reserved word
echo $VAR

Результат выполнения этого скрипта:
$ ./variables.sh
global variable
local variable
global variable

Передача аргументов в скрипт bash

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

#!/bin/bash
# use predefined variables to access passed arguments
#echo arguments to the shell
echo $1 $2 $3 ' -> echo $1 $2 $3'

# We can also store arguments from bash command line in special array
args=("$@")
#echo arguments to the shell
echo ${args[0]} ${args[1]} ${args[2]} ' -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}'

#use $@ to print out all arguments at once
echo $@ ' -> echo $@'

# use $# variable to print out
# number of arguments passed to the bash script
echo Number of arguments passed: $# ' -> echo Number of arguments passed: $#'

Давайте попробуем выполнить этот скрипт и предоставить три аргумента.

$ ./arguments.sh Bash Scripting Tutorial

Результаты, когда мы выполняем этот скрипт:
Bash Scripting Tutorial  -> echo $1 $2 $3
Bash Scripting Tutorial  -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}
Bash Scripting Tutorial  -> echo $@
Number of arguments passed: 3  -> echo Number of arguments passed: $#

Redirections

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

STDOUT из сценария bash в STDERR

#!/bin/bash
 
echo "Redirect this STDOUT to STDERR" 1>&2 

Чтобы доказать, что STDOUT перенаправляется на STDERR, мы можем перенаправить вывод скрипта в файл:

$ ./redirecting.sh
Redirect this STDOUT to STDERR
$ ./redirecting.sh > STDOUT.txt
$ cat STDOUT.txt
$ 
$ ./redirecting.sh 2> STDERR.txt
$ cat STDERR.txt
Redirect this STDOUT to STDERR

STDERR из сценария bash в STDOUT

#!/bin/bash
 
cat $1 2>&1

Чтобы доказать, что STDERR перенаправляется на STDOUT, мы можем перенаправить вывод скрипта в файл:
$ ./redirecting.sh /etc/shadow
cat: /etc/shadow: Permission denied
$ ./redirecting.sh /etc/shadow > STDOUT.txt
$ cat STDOUT.txt
cat: /etc/shadow: Permission denied
$ ./redirecting.sh /etc/shadow 2> STDERR.txt
cat: /etc/shadow: Permission denied
$ cat STDERR.txt
$

стандартный вывод на экран

Простой способ перенаправить стандартный вывод (stdout) — просто использовать любую команду, потому что по умолчанию стандартный вывод автоматически перенаправляется на экран. Сначала создайте файл file1:

$ touch file1
$ ls file1 
file1

stderr в файл

По умолчанию STDERR отображается на экране:

$ ls
file1  STDOUT
$ ls file2
ls: cannot access file2: No such file or directory

В следующем примере мы перенаправим стандартную ошибку (stderr) в файл, а стандартный вывод — на экран по умолчанию. Обратите внимание, что на экране отображается STDOUT, однако STDERR перенаправляется в файл с именем STDERR:

стандартный вывод в стандартный вывод

Также возможно перенаправить STDOUT и STDERR в один и тот же файл. В следующем примере мы перенаправим STDOUT на тот же дескриптор, что и STDERR. И STDOUT, и STDERR будут перенаправлены в файл «STDERR_STDOUT».

$ ls
file1  STDERR  STDOUT
$ ls file1 file2 > STDERR_STDOUT 2>&1
$ cat STDERR_STDOUT 
ls: cannot access file2: No such file or directory
file1

stderr и stdout в файл

Предыдущие два примера перенаправляли STDOUT и STDERR в файл. Другой способ добиться того же эффекта показан ниже:

$ ls
file1  STDERR  STDOUT
$ ls file1 file2 &> STDERR_STDOUT
$ cat STDERR_STDOUT 
ls: cannot access file2: No such file or directory
file1
 
или
ls file1 file2 >& STDERR_STDOUT
$ cat STDERR_STDOUT 
ls: cannot access file2: No such file or directory
file1

Заключительные мысли



В этом руководстве по сценариям Bash мы узнали, как начать работу со сценариями Bash, изучив все основы наиболее распространенных аспектов, таких как циклы, арифметика, сравнения и т. д. Это руководство послужило введением в концепции сценариев Bash и дало у вас есть некоторое представление о том, как работает оболочка Bash. Адаптируя наши примеры для своих нужд и расширяя их по мере необходимости, вы будете на пути к освоению сценариев Bash.

You may also like

Leave a Comment