Contents
Учебное пособие по написанию сценариев Bash
Оболочка Bash — один из самых мощных компонентов системы Linux , а также одна из самых веских причин для использования Linux. Пользователи могут взаимодействовать с Bash через командную строку и писать сценарии для автоматизации задач.
Хотя это может показаться пугающим для начинающих пользователей, начать работу со сценариями Bash несложно. В этом руководстве мы рассмотрим различные примеры сценариев Bash, чтобы показать вам, на что они способны, и как использовать различные аспекты Bash.
Лучший способ узнать о написании сценариев Bash — это скопировать некоторые из наших примеров в свою систему. Редактируйте их, выполняйте и учитесь по ходу дела. Мы поможем вам пройти все этапы. Давайте начнем!
В этом руководстве по написанию сценариев Bash вы узнаете:
- Как написать свой первый сценарий Hello World Bash
- Как передать аргументы сценарию Bash
- Как использовать глобальные и локальные переменные в Bash
- Как читать пользовательский ввод
- Как загружать и читать массивы в Bash
- Как сравнивать целые числа и строки
- Как определить типы файлов в Bash
- Как использовать
for
,while
, иuntil
циклы - Как использовать функции в Bash
- Как использовать
if
заявления - Как использовать
case
заявления - Как использовать кавычки и специальные символы в Bash
- Как выполнять арифметические вычисления с помощью Bash
- Как использовать перенаправление Bash
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.