Bash Scripting: руководство по созданию

Сценарии Bash scripting используются системными администраторами, программистами, сетевыми инженерами, учеными и практически всеми, кто регулярно использует систему Linux/Unix. Независимо от того, что пользователь делает и каков его общий уровень мастерства владения компьютером, он может найти подходящий для себя способ использовать Bash scripting. Хотя правильно, они называются shell-скриптами, но большинство программистов именуют их сценариями Bash.

В качестве интерактивной оболочки - это краткий язык для инициирования и управления вычислениями. В качестве языка сценариев он является языком, специфичным для домена, для управления и компоновки процессов и файлов.

Определение сценария Bash

Bash scripting - интерпретатор командного языка. Он широкодоступен в различных операционных системах и является анализатором команд по умолчанию для большинства систем GNU/Linux. Это аббревиатура «Bourne Again SHell».

Другие определения:

  1. Shell - это макропроцессор, который позволяет выполнять интерактивное или не интерактивное выполнение команды.
  2. Scripting позволяет настроить автоматическое выполнение команд, которые в противном случае действовали бы интерактивно один за другим.

Bash scripting установлен по умолчанию во многих системах GNU/Linux, поэтому сценарий оболочки работает даже без определения его в качестве интерпретатора. Чтобы узнать, что выполняет команда по умолчанию, прописывают:

$ echo $SHELL /bin/bash.

Существуют и другие интерпретаторы оболочки, такие как Korn, C и многие другие. По этой причине рекомендуется определить интерпретатор оболочки, который будет использоваться конкретно для содержимого скрипта.

Теперь все скрипты будут включать определение интерпретатора оболочки: #!/bin/bash.

Более конкретно об этом написано в специальной литературе Advanced Bash scripting guide.

Имена файлов и разрешения

Для выполнения сценария оболочки файл должен быть исполняемым, выполненным с помощью «chmod +x FILENAME» команды. По умолчанию любые вновь созданные файлы не исполняются независимо от суффикса расширения файла. На самом деле, последнее свойство в системах GNU/Linux в основном не имеет никакого значения.

При выполнении «ls» команды для перечисления всех файлов и каталогов сразу становится ясно, что файл с расширением «.sh» является правдоподобным сценарием оболочки, а с «.jpg» будет сжатым изображением. Более подробно о расширении файлов для этого языка можно ознакомиться в учебниках Advanced Bash scripting guide.

В системах GNU/Linux file команда может использоваться для идентификации типа файла. Как видно из приведенного ниже примера, расширение файла не имеет никакого значения, а интерпретатор оболочки в этом случае имеет больший вес.

Таким образом, имя сценария оболочки «0_xyz» отлично действует, хотя программисты по возможности стараются его избегать.

Команда оболочки PATH

Когда разработчик вводит команду в оболочку, Bash смотрит в определенные каталоги, чтобы узнать, может ли он найти ее. Поэтому, согласно Bash scripting guide, если набирают «ls» в оболочке, он выполнит только команду, если она находится на его пути. Операция завершится с ошибкой, если ее не будет в одном из каталогов, которые являются частью маршрута. Если есть совпадение в более чем в одном из каталогов на пути, он выбирает первый. Можно маршрут узнать, запустив:

echo $ PATH.

На экране монитора появиться что-то вроде этого:

/home/jzb/bin:/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/usr/lib/jvm/jre/bin.

Правильный путь домашнего каталога

Каждый каталог, в котором выглядит Bash, разделяется двоеточием. При этом, первым из них будет проверяться каталог «bin», а затем / usr / local / bin, / usr / bin.

Если пользователь вошел в систему как root, он должен увидеть другой набор каталогов, включая / usr / local / sbin, / usr / sbin.

Можно добавить их в путь или изменить его, отредактировав файлы:

~ / .bashrc и ~ / .bash_profile.

Например: PATH="$HOME/bin:$PATH" .

Можно немного изменить это правило и установить advanced Bash scripting. PATH "=" сообщит Bash, что он будет устанавливать путь, а «$ HOME / bin» предлагает ему добавить каталог bin, а после «$ PATH» рекомендует ему добавить все, что уже находится на маршруте.

Параметр «:» - разделитель между элементами. Разработчик увидит на экране своего монитора что-то вроде этого:

if [ -d "$HOME/bin" ] ;

then PATH="$HOME/bin:$PATH"

fi.

Это правило проверит, существует ли каталог «bin» в домашнем каталоге, а затем добавит его в путь, чтобы далее правильно выполнить операцию «run Bash script».

Строчный псевдоним

Псевдоним - это строка, в которой Bash будет заменяться другой командой. Простой пример:

alias ls = 'ls --color = auto'.

Это говорит ему, что, когда запускают «ls», нужно запустить «ls --color = auto», без набора всего остального. Можно установить псевдонимы в командной строке, и это хорошо для тестирования.

При этом имеет смысл установить псевдонимы в «~ / .bash_profile и ~ / .bashrc». Или создать что-то вроде «~ / .aliases» и вызвать это из файлов конфигурации следующим образом:

if [ -f ~/.bash_aliases ];

then . ~/.bash_aliases

fi

Чтобы увидеть уже имеющиеся псевдонимы, просто запускают его в оболочке. Он значится по умолчанию в дистрибутиве. Вот, например, набор по умолчанию, установленный на openSUSE 11.2, без каких-либо изменений.

В качестве теста, можно увидеть, что уже установлено дистрибутивом, и попытаться составить несколько собственных вариантов.

Расширение оболочки

Прежде чем Bash выполнит команду, он оценивает ввод и «расширяет» псевдонимы и другие выражения всегда, когда это необходимо. У него есть несколько символов, которые он обязательно расширяет, чтобы соответствовать одному или нескольким символам, и они называются «подстановочными знаками». Такое сопоставление шаблонов может быть действительно полезным.

Например, если нужно видеть все JPEG-файлы в каталоге, запускают «ls * jpg», при условии, что JPEG-файлы обозначены как «jpg», и Bash расширит это, чтобы соответствовать любому имени файла, которое заканчивается на jpg.

Если нужно совместить только 1 символ, используют «?». Это будет указывать на один знак, поэтому «ls? .Jpg» будет соответствовать только именам файлов, например, «1.jpg» или «a.jpg», а не «01.jpg».

Bash также позволяет сопоставлять диапазоны символов с помощью скобок. Использование [abc12] будет соответствовать одному из символов при расширении. Так, работая «ls -lh [abc12] .jpg», будет соотноситься с a.jpg, b.jpg, c.jpg, 1.jpg и 2.jpg, но не 12.jpg или abc.jpg. Можно свести на нет шаблон путем префикса «bang» (!), Например: ls -lh [! Ab12] .jpg будет соответствовать c.jpg или 3.jpg, но не 2.jpg и т. д.

Еще один удобный трюк - расширение брекета, когда нужно организовывать документы по годам и датам. Если, например, в папке ~ / Documents есть каталог 2010 с подкаталогами с 01 по 12 и не нужно печатать с 01 по 12, делают Bash вместо этого: mkdir 2010 / {01..12}. Когда он читает правило, он расширяет то, что находится в фигурных скобках, с 01 по 12. Это также работает с буквами, поэтому, если нужны подкаталоги через z, то можно запустить mkdir {a..z} и он создаст каталоги через z. Может также работать с заглавными буквами.

Выполнение сценария

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

Другой метод осуществления сценариев - это явно вызвать его интерпретатор, например, $ bash date.sh. Следовательно, будет выполняться сценарий без необходимости запуска скрипта оболочки и без объявления shebang, непосредственно в схеме операционной системы, вызывая исполняемый двоичный файл bash. Таким образом, содержимое файла date.sh будет загружаться и интерпретироваться, как Bash Shell Script.

Относительный и абсолютный путь

Перед тем как запрограммировать официальный сценарий оболочки, например, exit Bash script, нужно определить навигацию с ней и установить разницу между относительным и абсолютным путем к файлу. Вероятно, лучшая аналогия, объясняющая относительный и абсолютный путь к файлу – это визуализировать файловую систему GNU/Linux, как многоэтажное здание.

Корневой каталог - входная дверь здания, обозначенная позицией, он обеспечивает вход во всю файловую систему «строения», следовательно, дает доступ ко всем каталогам - «этажам» и «комнатам» - и файлам - «жильцам». Чтобы, например, перейти в комнату 1 на 3 этаже, сначала нужно войти в главную дверь, а затем перейти на 3 этаж (level3)и оттуда войти в комнату (room1). Следовательно, абсолютный путь к этой конкретной комнате на этаже внутри здания «/level3/room1».

Отсюда, если нужно посетить room2 также на уровне 3, сначала фиксируют текущее местоположение, которое является комнатой 1, введя, «../», а затем, включив имя комнаты «room2». При этом принимается относительный путь в комнату 2, который в этом случае «../room2». Поскольку в данном примере пользователь уже был на третьем уровне, ему не нужно покидать все здание и заново проходить абсолютный путь через главный вход /level3/room2.

К счастью, GNU/Linux имеет простой инструмент компаса, который поможет программисту перемещаться по всей файловой системе в виде «pwd» команды. Эта команда при выполнении всегда будет печатать текущее местоположение. Следующий пример будет использовать «cd» и «pwd» команду для навигации по файловой системе GNU/Linux с использованием абсолютных и относительных путей.

Далее продолжение.

Выполняют «cd» команду без каких-либо аргументов, чтобы мгновенно перейти в домашний каталог пользователя из любого места. Как видно, навигация через файловую систему GNU/Linux - это и простая, и в то же время очень запутанная тема.

Понятие переменных

Почти каждый язык программирования имеет понятие переменных - символическое имя для части памяти, которой можно назначать значения, читать и манипулировать его содержимым. Например, для Bash script example, «Hello World» можно выполнить с помощью переменных. Обращают внимание, что не должно быть пробелов вокруг знака «=»:

  • VAR=value работает;
  • VAR = value не работает.

В первом случае оболочка видит символ «=» и обрабатывает команду как назначение переменной. Во втором случае оболочка предполагает, что VAR должен быть именем команды и пытается ее выполнить. Вводят следующий код в var.sh.

Это присваивает переменной «Hello World» переменную MY_MESSAGE. При этом нужны кавычки вокруг строки Hello World, а переменная может содержать только 1 значение, поэтому строка с пробелами должна быть процитирована так, чтобы оболочка знала, что все это рассматривается как одно. В противном случае оболочка попытается выполнить команду «World» после назначения «MY_MESSAGE=Hello».

Оболочка не требовательна к типам переменных, они могут хранить строки, целые числа, реальные числа - все, что нравится пользователю. Опытные программисты обращают внимание на то, что специальные символы должны быть правильно экранированы. Для этого используется команда «shell-builtin, read», которая считывает строку из стандартного ввода в поставляемую переменную. Если и дать ему полное имя и не использовать двойные кавычки вокруг «echo» команды, оно все равно выводится правильно.

Большинство языков имеют концепцию циклов, если нужно повторить задачу двадцать раз, вряд ли пользователь захочет вводить код 20 раз, да еще, наверняка, с ошибками. Для этого существуют «for» и «while» петли в оболочке Борна. Это дает несколько меньше возможностей, чем другие языки, но никто и не утверждает, что программирование оболочки имеет силу C. For-цикл повторяется через набор значений до тех пор, пока список не будет исчерпан, ghb ‘njv значения могут быть любыми.

Первый скрипт

Для первого сценария оболочки можно просто написать сценарий, который говорит «Hello World». Создают файл (first.sh) следующим образом: first.sh Первая строка сообщает Unix, что файл должен быть запущен / bin / sh. Это стандартное расположение оболочки практически для каждой системы Unix.

Если используется Linux Bash script, тогда GNU/Linux / bin / sh обычно является символической ссылкой на bash, или совсем недавно стало применяться тире. Вторая строка начинается со специальным символом « #». Это отмечает строку, как комментарий, и она полностью игнорируется оболочкой. Единственное исключение - когда начинается первая строка файла « #!». Это специальная директива, которую Unix рассматривает особо и означает, что даже если используют «csh», «ksh» или что-то еще в качестве интерактивной оболочки, то последующее интерпретироваться Bourne.

Аналогично, Perl может начинаться строчкой:

#!/usr/bin/perl

Это сообщит интерактивной оболочке, что следующая команда должна выполняться perl. Для программирования оболочки Bourne обычно придерживаются:

#!/bin/sh.

Третья строка выполняет команду «echo» с двумя параметрами или аргументами: первая - "Hello"; вторая - это "World". Обращают внимание, что «echo» автоматически будет устанавливать одно пространство между его параметрами. Символ до сих пор отмечает комментарий «#», а все последующие за ней игнорируются оболочкой.

Тест для проверки сценария

Тест используется практически для каждого написанного сценария оболочки. При этом «test» не называется так напрямую, чаще применяют обозначение «[». Он является символической ссылкой этого слова, чтобы сделать программы оболочки более читаемыми.

Обычно это означает, что сама оболочка Bash shell script будет интерпретироваться «[», как значение «test», даже если среда Unix настроена по-разному. Это означает, что «[» на самом деле это программа, как «ls» и другие, поэтому она должна быть окружена пробелами: if [$ foo = "bar"] не будет работать, так как это интерпретируется как: if test$foo = "bar" ], что является «]» без начала «[».

В этом случае помещают пробелы вокруг всех операторов и выделяют обязательные словом «SPACE», заменяя его на фактическое пространство, иначе, если там нет места, это не сработает:

if SPACE [SPACE "$ foo" SPACE = SPACE "bar" SPACE]

Некоторые оболочки принимают «==» для сравнения строк. Для последних лучше использовать одиночный « » или «-eq» для целых чисел.

Как видно, тест - простая, но мощная утилита сравнения, которая необходима для работы в оболочке.

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

Комментарии