как сохранить bash скрипт
compizomania
Азбука в Linux для начинающих и не только. Я знаю только то, что ничего не знаю, но другие не знают и этого. Сократ
Страницы
03 января 2017
Как создать собственный script (скрипт-сценарий) в Linux
Прежде всего давайте разберём, что такое script и для чего он нужен.
Подобным же образом пишутся скрипты для выполнения списка задач, которые пользователь составляет вместе (код), чтобы сделать их выполнение проще и быстрее в операционной системе. Для написания простых скриптов совсем не обязательно иметь образование программиста.
Для начала давайте создадим самый, что ни на есть, простейший скрипт-Shell для обновления системы.
Далее, следующей строкой следует описание того, что должен выполнить наш первый скрипт/сценарий:
# Мой первый Script обновления Ubuntu
Далее в скрипте следуют выполняемые строки с командами, в данном случае для обновления системы Ubuntu:
Вот и всё. Ваш первый скрипт создан. У вас должно получиться как на снимке:
Для того чтобы созданный файл/скрипт был исполняемый, ему нужно дать на это разрешение. Сделать это можно двумя способами.
1. Выполнить следующую команду в терминале:
sudo chmod +x обновление.sh
Либо в терминале вводим sh и перетаскиваем из файлового менеджера созданный файл с скриптом (также через пробел):
После того как путь к файлу отобразится после команды sh и пробела, достаточно нажать клавишу Enter (Ввод), чтобы выполнить обновление системы:
Теперь в любой момент вы можете сделать обновление системы созданным собственным скриптом.
Да, кто-то может возразить, что обновление системы не сложно сделать выполнением этих двух команд в терминале, зачем пыжиться и создавать какие-то скрипты? Всё верно. Но это пример создания простейшего скрипта, чтобы показать, что «не боги горшки обжигают» 😃.
Научившись писать и использовать простейшие скрипты, можно создать скрипт по настройке системы, с тем чтобы в случае переустановки системы могли воспользоваться созданным сценарием без необходимости искать каждый раз в сети сайты с подобными настройками.
В текстовом редакторе вводим первую обязательную строку:
Далее закомментированные строки с описанием:
# Настройка Ubuntu после уставновки
# Обновление системы
Ниже следуют команды обновления системы:
Строка описания: Добавление репозиториев:
И добавляете необходимые репозитории для дальнейшей установки программного обеспечения:
После того как необходимые репозитории добавлены (повторюсь, у вас могут быть свои репозитории, у меня пример), необходимо обновить систему:
Строка с описанием:
# Обновление системы после подключения репозиториев
И команда на выполнение:
Теперь, когда репозитории добавлены и система обновлена, наступила очередь в установке программ:
Для установки программ достаточно один раз ввести команду sudo apt install, а затем через пробел в данную строку добавлять сколько угодно программ, главное чтобы они были правильно составлены. Если какая-то программа состоит из нескольких слов, её команда должна быть монолитной, т.е. все слова в ней должны вводится через чёрточку, например: unity-tweak-tool:
Установка дополнительных кодеков
# Мультимедиа и кодеки
Отключение о сбоях в системе
# Отключить отчёты о сбоях в системе
Ну вот, пожалуй, и всё. Данный созданный файл сценария должен выглядеть следующим образом:
Делаем созданный скрипт исполняемым:
sudo chmod +x Настройка\ Ubuntu.sh
Для выполнения созданного скрипта введите в терминале sh и название созданного скрипта через пробел, либо sh, пробел и перетащить в терминал созданный файл, как объяснялось ранее в простейшем скрипте и нажмите клавишу Ввод, для его выполнения.
Введение в Bash
Введение
В этой статье мы ознакомимся с основами написания скриптов на bash для самых разнообразных целей: для упрощения рутинных задач и автоматизации постоянно повторяющихся действий, для запуска нескольких команд единовременно, или одной команды с трудными и обширными аргументами.
Требования
Настройка папки
Перед тем, как приступить к написанию скрипта на bash, рекомендуется создать для него отдельную папку, например,
Для создания папки введите в консоль следующую команду:
Откройте на редактирование /etc/profile, выполнив команду:
nano /etc/profile
Добавьте следующие строки в конец файла:
Создание файла
Для того чтобы запустить скрипт нужно создать исполняемый файл. Введите последовательно команды:
/bin/firstscript
chmod +x
Откройте текстовый редактор, чтобы заполнить исполняемый файл:
Любой bash-скрипт должен начинаться со строки: #!/bin/bash
В этой строке после #! указывается путь к bash-интерпретатору, поэтому если он установлен в другом месте (где именно, можно узнать, введя команду whereis bash), необходимо поменять путь.
Комментарии начинаются с символа # (кроме первой строки).
Заполните исполняемый файл firstscript следующими строками:
Сохраните внесенные изменения, нажав сочетание клавиш CTRL+X.
Запустите скрипт командой, которая является именем исполняемого файла:
firstscript
Результат должен выглядеть следующим образом:
Hello World!
Пример скрипта резервного копирования
Для создания bash-скрипта резервного копирования введите команды:
/bin/filebackup
chmod +x
/bin/filebackup
nano
Скрипт для запуска резервного копирования состоит из следующих строк:
После сохранения внесенных изменений можно протестировать свой скрипт, перейдя в любую папку в системе с несколькими файлами и запустив команду:
filebackup math.sh
Можно добавить сколько угодно файлов к этой последовательности, и все они будут скопированы в папку резервного копирования backup.
Введем команду и перейдем в папку резервного копирования:
Для просмотра файлов в папке введем команду:
В результате должно отобразиться следующее:
math.sh
Основные команды для написания bash скрипта
Существует ряд встроенных команд, которые используются для создания скриптов:
Работа с переменными
Самый распространенный способ хранения начальных данных — переменные. В самом начале программы объявляются несколько таких переменных, в которые пользователь записывает некоторые исходные данные.
Список зарезервированных переменных:
Пример работы с переменными и конфигурационным файлом
Такой способ хорош, если данных мало и скрипт рассчитан на автоматическое выполнение без участия пользователя.
Необходимо ясно известить пользователя о том, что и где ему необходимо вписать. Желательно собрать все это в одном месте — файле конфигурации. Подключить его можно командой source. Например, если конфигурационный файл будет лежать в той же директории, что и скрипт, мы получим:
В файл config.cfg не забудем поместить строчку: ЕMAIL=example@gmail.com
Пример работы с математическими операциями
Для работы с математическими операциями используется команда let, которая производит арифметические операции над числами и переменными.
Содержимое исполняемого файла:
Обновите название исполняемого файла, нажав сочетание клавиш CTRL+O, например, пусть он будет называться math, после чего нажмите клавишу Enter.
Сделайте файл исполняемым:
chmod +x math
math
Результат выполнения должен выглядеть следующим образом:
Введите a:
Введите b:
a+b= 135
a/b= 10
Список математических операций:
** — возведение в степень
% — модуль (деление по модулю), остаток от деления
Команда let позволяет использовать сокращения арифметических команд, тем самым сокращая количество используемых переменных, например: a = a+b эквивалентно a +=b.
Параметры скрипта
Еще один способ сообщить данные программе — указать при запуске в командной строке. Содержатся эти параметры в переменных с номерами.
Цикл for-in
Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
for переменная in список_значений
команды
done
Пример работы цикла for-in с параметрами
bash parametr one two four
В результате получим следующее:
four
Цикл while
Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно (код возврата = 0).
Синтаксис оператора следующий:
while выражение или команда возвращающая код возврата
команды
done
Пример работы с циклом until-do
В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно:
Результат выполнения скрипта:
Введите числитель:
Введите знаменатель:
НОД чисел 100 и 90 = 10
Условные операторы
Условный оператор используется для выполнения определенных действий, если условие является истинным или ложным. Это выполняется с помощью команды “If”. Синтаксис оператора следующий:
if ls folder
then
echo «Folder exists»
fi
Пример работы с условными операторами if-else
Введите последовательно команды:
/bin/fileifelse
chmod +x
/bin/fileifelse
nano
Заполните исполняемый файл fileifelse:
Результат работы скрипта fileifelse:
Введите название папки:
backup2
Папка существует и будет использована.
Какие файлы следует отправить в папку резервного копирования?
math.sh
Проверка наличия файлов в папке по команде ls backup2:
math.sh
Заключение
Мы ознакомились с основными командами для написания скриптов на bash, а также с работой с математическими операциями, с циклами и условными операторами.
Пошаговое руководство по написанию Bash-скриптов
Сегодня поговорим о bash-скриптах. Это — сценарии командной строки, написанные для оболочки bash. Существуют и другие оболочки, например — zsh, tcsh, ksh, но мы сосредоточимся на bash. Этот материал предназначен для всех желающих, единственное условие — умение работать в командной строке Linux.
Сценарии командной строки — это наборы тех же самых команд, которые можно вводить с клавиатуры, собранные в файлы и объединённые некоей общей целью. При этом результаты работы команд могут представлять либо самостоятельную ценность, либо служить входными данными для других команд. Сценарии — это мощный способ автоматизации часто выполняемых действий.
Итак, если говорить о командной строке, она позволяет выполнить несколько команд за один раз, введя их через точку с запятой:
На самом деле, если вы опробовали это в своём терминале, ваш первый bash-скрипт, в котором задействованы две команды, уже написан. Работает он так. Сначала команда pwd выводит на экран сведения о текущей рабочей директории, потом команда whoami показывает данные о пользователе, под которым вы вошли в систему.
Используя подобный подход, вы можете совмещать сколько угодно команд в одной строке, ограничение — лишь в максимальном количестве аргументов, которое можно передать программе. Определить это ограничение можно с помощью такой команды:
Командная строка — отличный инструмент, но команды в неё приходится вводить каждый раз, когда в них возникает необходимость. Что если записать набор команд в файл и просто вызывать этот файл для их выполнения? Собственно говоря, тот файл, о котором мы говорим, и называется сценарием командной строки.
Как устроены bash-скрипты
Команды оболочки отделяются знаком перевода строки, комментарии выделяют знаком решётки. Вот как это выглядит:
Тут, так же, как и в командной строке, можно записывать команды в одной строке, разделяя точкой с запятой. Однако, если писать команды на разных строках, файл легче читать. В любом случае оболочка их обработает.
Установка разрешений для файла сценария
Пошаговое руководство по написанию Bash-скриптов
Попытка запуска файла сценария с неправильно настроенными разрешениями
Сделаем файл исполняемым:
Теперь попытаемся его выполнить:
После настройки разрешений всё работает как надо.
Успешный запуск bash-скрипта
Вывод сообщений
Вот что получится после запуска обновлённого скрипта.
Вывод сообщений из скрипта
Использование переменных
Переменные позволяют хранить в файле сценария информацию, например — результаты работы команд для использования их другими командами.
Нет ничего плохого в исполнении отдельных команд без хранения результатов их работы, но возможности такого подхода весьма ограничены.
Существуют два типа переменных, которые можно использовать в bash-скриптах:
Переменные среды
Иногда в командах оболочки нужно работать с некими системными данными. Вот, например, как вывести домашнюю директорию текущего пользователя:
Использование переменной среды в сценарии
А что если надо вывести на экран значок доллара? Попробуем так:
В подобной ситуации поможет использование управляющего символа, обратной косой черты, перед знаком доллара:
Теперь сценарий выведет именно то, что ожидается.
Использование управляющей последовательности для вывода знака доллара
Пользовательские переменные
В дополнение к переменным среды, bash-скрипты позволяют задавать и использовать в сценарии собственные переменные. Подобные переменные хранят значение до тех пор, пока не завершится выполнение сценария.
Как и в случае с системными переменными, к пользовательским переменным можно обращаться, используя знак доллара:
Вот что получится после запуска такого сценария.
Пользовательские переменные в сценарии
Подстановка команд
Одна из самых полезных возможностей bash-скриптов — это возможность извлекать информацию из вывода команд и назначать её переменным, что позволяет использовать эту информацию где угодно в файле сценария.
Сделать это можно двумя способами.
Используя первый подход, проследите за тем, чтобы вместо обратного апострофа не ввести одиночную кавычку. Команду нужно заключить в два таких значка:
При втором подходе то же самое записывают так:
А скрипт, в итоге, может выглядеть так:
Скрипт, сохраняющий результаты работы команды в переменной
Математические операции
Математические операции в сценарии
Управляющая конструкция if-then
А вот рабочий пример:
В данном случае, если выполнение команды pwd завершится успешно, в консоль будет выведен текст «it works».
Вот что получается после запуска этого скрипта.
В этом примере, если пользователь найден, скрипт выведет соответствующее сообщение. А если найти пользователя не удалось? В данном случае скрипт просто завершит выполнение, ничего нам не сообщив. Хотелось бы, чтобы он сказал нам и об этом, поэтому усовершенствуем код.
Управляющая конструкция if-then-else
Напишем такой скрипт:
Запуск скрипта с конструкцией if-then-else
Ну что же, продолжаем двигаться дальше и зададимся вопросом о более сложных условиях. Что если надо проверить не одно условие, а несколько? Например, если нужный пользователь найден, надо вывести одно сообщение, если выполняется ещё какое-то условие — ещё одно сообщение, и так далее. В подобной ситуации нам помогут вложенные условия. Выглядит это так:
Сравнение чисел
В скриптах можно сравнивать числовые значения. Ниже приведён список соответствующих команд.
В качестве примера опробуем один из операторов сравнения. Обратите внимание на то, что выражение заключено в квадратные скобки.
Вот что выведет эта команда.
Сравнение чисел в скриптах
Значение переменной val1 больше чем 5, в итоге выполняется ветвь then оператора сравнения и в консоль выводится соответствующее сообщение.
Сравнение строк
В сценариях можно сравнивать и строковые значения. Операторы сравнения выглядят довольно просто, однако у операций сравнения строк есть определённые особенности, которых мы коснёмся ниже. Вот список операторов.
Вот пример сравнения строк в сценарии:
В результате выполнения скрипта получим следующее.
Сравнение строк в скриптах
Вот одна особенность сравнения строк, о которой стоит упомянуть. А именно, операторы «>» и « » как команду перенаправления вывода.
Вот как работа с этими операторами выглядит в коде:
Вот результаты работы скрипта.
Сравнение строк, выведенное предупреждение
Обратите внимание на то, что скрипт, хотя и выполняется, выдаёт предупреждение:
Теперь всё работает как надо.
Она отсортирует строки из файла так:
Если его запустить, окажется, что всё наоборот — строчная буква теперь больше прописной.
Команда sort и сравнение строк в файле сценария
В командах сравнения прописные буквы меньше строчных. Сравнение строк здесь выполняется путём сравнения ASCII-кодов символов, порядок сортировки, таким образом, зависит от кодов символов.
Проверки файлов
Пожалуй, нижеприведённые команды используются в bash-скриптах чаще всего. Они позволяют проверять различные условия, касающиеся файлов. Вот список этих команд.
Эти команды, как впрочем, и многие другие рассмотренные сегодня, несложно запомнить. Их имена, являясь сокращениями от различных слов, прямо указывают на выполняемые ими проверки.
Опробуем одну из команд на практике:
Этот скрипт, для существующей директории, выведет её содержимое.
Вывод содержимого директории
Полагаем, с остальными командами вы сможете поэкспериментировать самостоятельно, все они применяются по тому же принципу.
Итоги
Сегодня мы рассказали о том, как приступить к написанию bash-скриптов и рассмотрели некоторые базовые вещи. На самом деле, тема bash-программирования огромна. Эта статья является переводом первой части большой серии из 11 материалов. Если вы хотите продолжения прямо сейчас — вот список оригиналов этих материалов. Для удобства сюда включён и тот, перевод которого вы только что прочли.
Bash-скрипты, часть 2: циклы
Циклы for
Перебор простых значений
Пожалуй, самый простой пример цикла for в bash-скриптах — это перебор списка простых значений:
Перебор сложных значений
Вот что получится после того, как этот цикл пройдётся по списку. Как видите, результат вполне ожидаем.
Инициализация цикла списком, полученным из результатов работы команды
Ещё один способ инициализации цикла for заключается в передаче ему списка, который является результатом работы некоей команды. Тут используется подстановка команд для их исполнения и получения результатов их работы.
Тут надо учесть, что подобный подход, если ожидается построчная обработка данных, не сработает для файла более сложной структуры, в строках которого может содержаться по несколько слов, разделённых пробелами. Цикл будет обрабатывать отдельные слова, а не строки.
Что, если это совсем не то, что нужно?
Разделители полей
Причина вышеописанной особенности заключается в специальной переменной окружения, которая называется IFS (Internal Field Separator) и позволяет указывать разделители полей. По умолчанию оболочка bash считает разделителями полей следующие символы:
Если bash встречает в данных любой из этих символов, он считает, что перед ним — следующее самостоятельное значение списка.
После добавления этой команды в bash-скрипт, он будет работать как надо, игнорируя пробелы и знаки табуляции, считая разделителями полей лишь символы перевода строки.
Если этот скрипт запустить, он выведет именно то, что от него требуется, давая, в каждой итерации цикла, доступ к очередной строке, записанной в файл.
Обход файлов, содержащихся в директории
Один из самых распространённых вариантов использования циклов for в bash-скриптах заключается в обходе файлов, находящихся в некоей директории, и в обработке этих файлов.
Например, вот как можно вывести список файлов и папок:
Вот что выведет скрипт.
Обратите внимание на то, как мы инициализируем цикл, а именно — на подстановочный знак «*» в конце адреса папки. Этот символ можно воспринимать как шаблон, означающий: «все файлы с любыми именами». он позволяет организовать автоматическую подстановку имён файлов, которые соответствуют шаблону.
Циклы for в стиле C
Если вы знакомы с языком программирования C, синтаксис описания bash-циклов for может показаться вам странным, так как привыкли вы, очевидно, к такому описанию циклов:
На bash это можно написать так:
А вот рабочий пример:
Этот код выведет список чисел от 1 до 10.
Цикл while
Вот схема организации циклов while
while команда проверки условия
do
другие команды
done
Взглянем на пример скрипта с таким циклом:
Вложенные циклы
В теле цикла можно использовать любые команды, в том числе — запускать другие циклы. Такие конструкции называют вложенными циклами:
Ниже показано то, что выведет этот скрипт. Как видно, сначала выполняется первая итерация внешнего цикла, потом — три итерации внутреннего, после его завершения снова в дело вступает внешний цикл, потом опять — внутренний.
Обработка содержимого файла
Чаще всего вложенные циклы используют для обработки файлов. Так, внешний цикл занимается перебором строк файла, а внутренний уже работает с каждой строкой. Вот, например, как выглядит обработка файла /etc/passwd :
В этом скрипте два цикла. Первый проходится по строкам, используя в качестве разделителя знак перевода строки. Внутренний занят разбором строк, поля которых разделены двоеточиями.
Такой подход можно использовать при обработке файлов формата CSV, или любых подобных файлов, записывая, по мере надобности, в переменную окружения IFS символ-разделитель.
Управление циклами
Возможно, после входа в цикл, нужно будет остановить его при достижении переменной цикла определённого значения, которое не соответствует изначально заданному условию окончания цикла. Надо ли будет в такой ситуации дожидаться нормального завершения цикла? Нет конечно, и в подобных случаях пригодятся следующие две команды:
Команда break
Вот — то же самое, но уже для цикла while :
Команда continue
Когда в теле цикла встречается эта команда, текущая итерация завершается досрочно и начинается следующая, при этом выхода из цикла не происходит. Посмотрим на команду continue в цикле for :
Обработка вывода, выполняемого в цикле
Например, вместо того, чтобы показывать на экране то, что выводится в цикле, можно записать всё это в файл или передать ещё куда-нибудь:
Пример: поиск исполняемых файлов
Итоги
Сегодня мы поговорили о циклах for и while в bash-скриптах, о том, как их запускать, как ими управлять. Теперь вы умеете обрабатывать в циклах строки с разными разделителями, знаете, как перенаправлять данные, выведенные в циклах, в файлы, как просматривать и анализировать содержимое директорий.
Если предположить, что вы — разработчик bash-скриптов, который знает о них только то, что изложено в в самом начале этой статьи, то вы уже вполне можете написать кое-что полезное. Далее вы узнаете, как передавать bash-скриптам параметры и ключи командной строки, и что с этим всем делать.