Bash скрипты. Bash скрипты
Скачать 1.46 Mb.
|
Bash скрипты Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux. Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью. При этом результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд. Сценарии — это мощный способ автоматизации часто выполняемых действий. Как устроены bash-скрипты Создайте пустой файл с использованием команды “TOUCH” В его первой строке нужно указать, какую именно оболочку мы собираемся использовать. Нас интересует “BASH” , поэтому первая строка файла будет такой: В других строках этого файла символ решётки используется для обозначения комментариев, которые оболочка не обрабатывает. Однако, первая строка — это особый случай, здесь решётка, за которой следует восклицательный знак (эту последовательность называют ШЕБАНГ ) и путь к “BASH” , указывают системе на то, что сценарий создан именно для “BASH” Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит: Тут, так же, как и в командной строке, можно записывать команды в одной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает. Установка разрешений для файла сценария Сохраните файл, дав ему имя myscript, и работа по созданию bash-скрипта почти закончена. Сейчас осталось лишь сделать этот файл исполняемым, иначе, попытавшись его запустить, вы столкнётесь с ошибкой Permission denied. Попытка запуска файла сценария с неправильно настроенными разрешениями Сделаем файл исполняемым: Теперь попытаемся его выполнить: После настройки разрешений всё работает как надо. Вывод сообщений Для вывода текста в консоль Linux применяется команда echo. Воспользуемся знанием этого факта и отредактируем наш скрипт, добавив пояснения к данным, которые выводят уже имеющиеся в нём команды: Вот что получится после запуска обновлённого скрипта. Использование переменных Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами. Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены. Существуют два типа переменных, которые можно использовать в bash-скриптах: Переменные среды Пользовательские переменные Переменные среды Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя: Обратите внимание на то, что мы можем использовать системную переменную $HOME в двойных кавычках, это не помешает системе её распознать. Вот что получится, если выполнить вышеприведённый сценарий. А что если надо вывести на экран значок доллара? Попробуем так: Система обнаружит знак доллара в строке, ограниченной кавычками, и решит, что мы сослались на переменную. Скрипт попытается вывести на экран значение неопределённой переменной $1. Это не то, что нам нужно. Что делать? В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара: Теперь сценарий выведет именно то, что ожидается. Пользовательские переменные В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария. Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара: Вот что получится после запуска такого сценария. Подстановка команд Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария. Сделать это можно двумя способами. С помощью значка обратного апострофа «`» С помощью конструкции $() Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка: При втором подходе то же самое записывают так: А скрипт, в итоге, может выглядеть так: В ходе его работы вывод команды pwdбудет сохранён в переменной mydir, содержимое которой, с помощью команды echo, попадёт в консоль. Математические операции Для выполнения математических операций в файле скрипта можно использовать конструкцию вида $((a+b)): Управляющая конструкция if-then В некоторых сценариях требуется управлять потоком исполнения команд. Например, если некое значение больше пяти, нужно выполнить одно действие, в противном случае — другое. Подобное применимо в очень многих ситуациях, и здесь нам поможет управляющая конструкция if-then. В наиболее простом виде она выглядит так: А вот рабочий пример: Вот что получается после запуска этого скрипта. В данном случае, если выполнение команды pwdзавершится успешно, в консоль будет выведен текст «it works». Воспользуемся имеющимися у нас знаниями и напишем более сложный сценарий. Скажем, надо найти некоего пользователя в /etc/passwd, и если найти его удалось, сообщить о том, что он существует. В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код. Управляющая конструкция if-then-else Если первая команда возвратит ноль, что означает её успешное выполнение, условие окажется истинным и выполнение не пойдёт по ветке else. В противном случае, если будет возвращено что-то, отличающееся от нуля, что будет означать неудачу, или ложный результат, будут выполнены команды, расположенные после else. Для того, чтобы программа смогла сообщить и о результатах успешного поиска, и о неудаче, воспользуемся конструкцией if-then-else. Вот как она устроена: Напишем такой скрипт: Его исполнение пошло по ветке else. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так: Если первая команда вернёт ноль, что говорит о её успешном выполнении, выполнятся команды в первом блоке then, иначе, если первое условие окажется ложным, и если вторая команда вернёт ноль, выполнится второй блок кода. |