Что такое «bash» или как создать(написать) script

Что такое скрипт Bash?

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

Сценарий Bash — это простой текстовый файл, содержащий ряд команд. Эти команды представляют собой смесь команд, которые мы обычно будем вводить в командной строке (например, ls или cp ) и команды, которые мы могли бы вводить в командной строке, но обычно не могли (вы обнаружите их на следующих нескольких страницах ). Важно помнить, однако, что:

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

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

Согласие давать файлы, которые являются сценариями Bash, расширением .sh (например, myscript.sh). Как вам было бы известно (и если вам, возможно, не стоит рассматривать обзор нашего учебника по Linux ), Linux — это система без расширения, поэтому для работы сценария необязательно иметь эту характеристику.

Как они работают?

Это всего лишь немного знания фона. Нет необходимости понимать это, чтобы писать сценарии, но может быть полезно узнать, как только вы начнете получать более сложные скрипты (и скрипты, которые вызывают и полагаются на другие скрипты, когда вы начнете получать действительно фантазии).

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

 Когда мы говорим, что мы запускаем программу, мы на самом деле не запускаем программу, а ее копию, которая называется процессом. Мы делаем копию этих инструкций и ресурсов с жесткого диска в рабочую память (или оперативную память).

 Мы также выделяем немного места в ОЗУ для процесса хранения переменных (для хранения временных рабочих данных) и нескольких флагов, чтобы позволить операционной системе (ОС) управлять процессом и отслеживать процесс во время его выполнения.

По сути, процесс — это исполняемый экземпляр программы.

Одновременно может быть несколько процессов, представляющих одну и ту же программу, выполняемую в памяти. Например, я мог бы открыть два терминала и запустить команду cp в обоих из них. В этом случае в системе будет два процесса cp. Как только они закончат запуск системы, они уничтожат их, и больше нет процессов, представляющих программу cp.

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

Как мы их запускаем?

Запуск сценария Bash довольно прост. Другим термином, который вы можете встретить, является выполнение скрипта (что означает одно и то же).

 Прежде чем мы сможем выполнить скрипт, он должен иметь набор разрешений на выполнение (по соображениям безопасности это прохождение обычно не устанавливается по умолчанию).

 Если вы забудете предоставить это разрешение перед запуском скрипта, вы просто получите сообщение об ошибке, сообщающее вам как таковое, и никакого вреда не будет.

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

Вот содержание myscript.sh

Давайте разберем это:

  • Строка 1 — это то, что называется shebang . См. Ниже, что это.
  • Строка 2 — это комментарий. Ничего после # не выполняется. Это только для нашей справки.
  • Строка 4 — это эхо-команда, которая выводит сообщение на экран. Вы можете ввести эту команду самостоятельно в командной строке, и она будет вести себя точно так же.
  • Подсветка синтаксиса предназначена только для упрощения чтения и не требуется делать что-то в ваших собственных файлах (помните, что это просто текстовые файлы).

Почему ./

Возможно, вы заметили, что когда мы запускаем обычную команду (например, ls ), мы просто вводим ее имя, но при запуске сценария выше я помещаю a ./ перед ним.

 Когда вы просто вводите имя в командной строке, Bash пытается найти его в серии каталогов, хранящихся в переменной с именем $PATH.

 Мы можем увидеть текущее значение этой переменной с помощью команды echo (вы узнаете больше об переменных в следующем разделе).

Каталоги разделяются символом » : «

Bash только просматривает эти конкретные каталоги и не рассматривает вспомогательные каталоги или ваш текущий каталог. Он будет просматривать эти каталоги в порядке и выполнять первый экземпляр программы или скрипта, который он находит.

Переменная $PATH — это индивидуальная пользовательская переменная, поэтому каждый пользователь в системе может настроить ее на соответствие.

Это делается по нескольким причинам.

  • Это позволяет нам иметь несколько различных версий установленной программы. Мы можем контролировать, какой из них выполняется, основываясь на том, где он находится в нашей $PATH.
  • Это позволяет для удобства. Как вы видели выше, первый каталог для меня — это каталог bin в моем домашнем каталоге. Это позволяет мне создавать свои собственные скрипты и программы, и я могу использовать их независимо от того, где я нахожусь в системе, просто набрав их имя. Я мог бы даже создать сценарий с тем же именем, что и программа (для работы в качестве обертки), если бы я хотел немного по-другому.
  • Это повышает безопасность. Например, злоумышленник может создать скрипт ls, который фактически удаляет все в вашем домашнем каталоге. Вы не захотите случайно запустить этот скрипт. Но пока это не в вашей $PATH, этого не произойдет.

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

 Вы делаете это путем включения абсолютного или относительного пути перед именем программы или скрипта. Вы помните, что точка (.) На самом деле является ссылкой на ваш текущий каталог.

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

Shebang(#!)

#!/bin/bash

Это первая строка сценария выше. Символьная последовательность символов хеш-символа (#!) Называется Shebang.

 После этого это путь к интерпретатору (или программе), который должен использоваться для запуска (или интерпретации) остальных строк в текстовом файле.

 (Для сценариев Bash это будет путь к Bash, но есть много других типов скриптов, и каждый из них имеет свой собственный интерпретатор.)

Здесь важно форматирование. Шейнг должен находиться в самой первой строке файла (строка 2 не будет выполняться, даже если первая строка пуста). Также не должно быть пробелов перед символом # или между ними и путь к интерпретатору.

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

Можно оставить строку с shebang и все еще запустить скрипт, но это неразумно.

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

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

Вы также можете запустить Bash, передавая скрипт в качестве аргумента.

Хотя это и безопасно, это также требует ненужного ввода при каждом запуске скрипта.

Учитывая вышеизложенные наблюдения, лучше всегда включать shebang ( #! ). Это самый надежный и удобный подход.

Как мы видели выше, форматирование для shebang было важно (т.е. не было пробелов, должно быть на первой линии). В сценариях Bash есть много областей, где важно форматирование.

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

 Также получайте привычку помнить о наличии или отсутствии пробелов при просмотре кода.

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

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

Читайте также:  Релиз opera 49 с многими улучшениями

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

Я видел, как студенты тратят немало времени на разочарование тем, что кусок кода, который выглядит отлично, не работает. Они становятся довольно смущенными, когда узнают виновника (пространство, которое должно или не должно быть там). Вы, вероятно, сделаете эту ошибку несколько раз сами, прежде чем она опустится, так что не беспокойтесь слишком много, но чем скорее вы получите ее, тем счастливее вы будете

Источник: https://bunkerbook.ru/bash-lessons/chto-takoe-skript-bash/

Написание скриптов в Linux. Каковы принципы составления сценариев на Bash?

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

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

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

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

Заметка
Данный урок описывает лишь общие теоретические принципы использования сценариев в операционной системе Linux. Следующие статьи учебного курса дают более детальную информацию.

Небольшой пример сценария

Ниже приводится пример скрипта, ищущего все файлы журналов в директории /var/log. Если вызов происходит без указания параметров, имена всех журналов записываются в файл log-list.txt, лежащий в домашней директории пользователя. При указании строкового параметра поиск осуществляется по его вхождению в имена файлов. Данный Bash скрипт должен работать одинаково в любом дистрибутиве Linux.

#!/bin/bash if [ -n «$1» ]; then
    find /var/log -type f -name «*$1*.log» -print > ~/log-list.txt
    echo «Осуществлен поиск по фразе '$1'» else
    find /var/log -type f -name «*.log» -print > ~/log-list.txt
    echo 'Поиск всех файлов журналов закончен'
fi

Создайте в директории /usr/local/bin файл с именем findlog и скопируйте в него, приведенный выше программный код.

Файл нужно сделать исполняемым с помощью команды chmod, или нажмите по нему правой кнопкой мыши и зайдите в пункт «свойства».

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

sudo findlog 'error'
Осуществлен поиск по фразе 'error' sudo findlog
Поиск всех файлов журналов закончен

Пояснения к использованию сценариев

Любой скрипт, создаваемый в Linux, должен начинаться со строки определения исполняемой программы. Обратите внимание на первую строчку из примера «#!/bin/bash».

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

В данном случае мы указали место расположения исполняемого файла командного интерпретатора Bash.

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

Мы поместили сценарий в директории /usr/local/bin. Это одна из папок, на которые операционная система обращает особое внимание. При вводе имени команды в окне терминала, ОС просматривает ряд папок на наличие одноименного исполняемого файла.

Если скрипт расположен в какой-либо другой директории, вызвать его можно с помощью прямого обращения. Для этого нужно указать абсолютный или относительный путь до файла. Если файл расположен в текущей директории, обязательным условием является использование конструкции «./имя_скрипта».

Переменная окружения $PATH содержит все системные директории, по которым осуществляется поиск программ. Они разделяются двоеточием. Посмотреть список можно с помощью приведенного ниже примера.

echo $PATH
/home/username/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Источник: https://coder-booster.ru/learning/linux-beginners/basics-of-writing-scripts-for-bash

Руководство по созданию скриптов для Bash

Каким бы простым ни пытались разработчики дистрибутивов Linux сделать свои графические интерфейсы, всё равно многие задачи удобно решать через терминал. Во-первых, потому что это быстрее, во-вторых, не на всех машинах есть графический интерфейc.

Опытные пользователи часто выполняют различные задачи через терминал.

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

Это очень неудобно и таких действий очень много, даже, например, резервное копирование и загрузка скопированных файлов на удаленный сервер. Поэтому можно использовать скрипты, чтобы не вводить одни и те же команды несколько раз.

А еще настоятельно рекомендуется не решать рутинные задачи копипастом кода себе в консоль из интернета. Мы рассказывали, почему, в одной из наших статей.

Следующая серия статей поможет вам освоить bash:

  • Bash Script Step By Step — о том, как начать создание bash-скриптов, рассмотрено использование переменных, описаны условные конструкции, вычисления, сравнения чисел, строк, выяснение сведений о файлах.
  • Bash Scripting Part 2, Bash the awesome. Раскрываются особенности работы с циклами for и while.
  • Bash Scripting Part 3, Parameters & options. Эта часть посвящена параметрам командной строки и ключам, которые можно передавать скриптам, работе с данными, которые вводит пользователь и которые можно читать из файлов.
  • Bash Scripting Part 4, Input & Output. Здесь речь идёт о дескрипторах файлов и о работе с ними, о потоках ввода и вывода, ошибок, о перенаправлении вывода.
  • Bash Scripting Part 5, Sighals & Jobs посвящена сигналам Linux, их обработке в скриптах, запуску сценариев по расписанию.
  • Bash Scripting Part 6, Functions. Из этой статьи можно узнать о создании и использовании функций в скриптах, о разработке библиотек.
  • Bash Scripting Part 7, Using sed посвящена работе с потоковым текстовым редактором sed.
  • Bash Scripting Part 8, Using awk — о программировании на языке обработки данных awk.
  • Bash Scripting Part 9, Regular Expressions. В этой части можно почитать об использовании регулярных выражений в bash-скриптах.
  • Bash Scripting Part 10, Practical Examples. О приёмах работы с сообщениями, которые можно отправлять пользователям, и методике мониторинга диска. Кстати, для мониторинга системы есть множество утилит, самые удобные из которые мы рассматривали в нашей подборке.
  • Bash Scripting Part 11, Expect Command посвящена средству expect, с помощью которого можно автоматизировать взаимодействие с интерактивными утилитами. В частности, здесь идёт речь об expect-скриптах и об их взаимодействии с bash-скриптами и другими программами.

Дмитрий Юрченко, бог терминала

Источник: https://tproger.ru/articles/bash-scripts-guide/

Пишем скрипты на Bash

Каждый Bash-скрипт стоит начинать со следующих строк:

#!/bin/bash set -o nounset set -o errexit

Это защищает от двух частых ошибок 1) Попыток использовать не объявленные переменные 2) Игнорирование аварийного завершения команд

Если команда может завершиться аварийно, и нас это устраивает, можно использовать следующий код:

if ! ; then echo «failure ignored» fi

Нужно помнить что некоторые команды не возвращают код аварийного завершения например “mkdir -p” и “rm -f”.
Так же есть сложности с вызовом цепочек подпрограмм (command1 | command 2 | command3) из скрипта, для обхода этого ограничения можно использовать следующую конструкцию:

(./failing_command && echo A)

В этом случае оператор ‘&&’ не позволит выполниться следующей команде, подробнее — ‘http://fvue.nl/wiki/Bash:_Error_handling’

Функции

Bash позволяет использовать функции как обычные команды, это очень сильно повышает читаемость вашего кода:
Пример 1:

ExtractBashComments() { egrep «^#» } cat myscript.sh | ExtractBashComments | wc comments=$(ExtractBashComments < myscript.sh)

Пример 2:

SumLines() { # iterating over stdin — similar to awk local sum=0 local line=”” while read line ; do sum=$((${sum} + ${line})) done echo ${sum} } SumLines < data_one_number_per_line.txt

Пример 3:

log() { # classic logger local prefix=»[$(date +%Y/%m/%d %H:%M:%S)]: » echo «${prefix} $@» >&2 } log «INFO» «a message»

Попробуйте перенести весь ваш код в функции оставив только глобальные переменные/константы и вызов функции «main» в которой будет вся высокоуровневая логика.

Объявление переменных

Bash позволяет объявлять переменные нескольких типов, самые важные:
local (Для переменных используемых только внутри функций)
readonly (Переменные попытка переназначения которых вызывает ошибку)

## Если DEFAULT_VAL уже объявлена, то использовать ее значение, иначе использовать '-7' readonly DEFAULT_VAL=${DEFAULT_VAL:-7} myfunc() { # Использование локальной переменной со значением глобальной local some_var=${DEFAULT_VAL} … }

Есть возможность сделать переменную типа readonly из уже объявленной:

x=5 x=6 readonly x x=7 # failure

Стремитесь к тому что бы все ваши переменные были либо local, либо readonly, это улучшит читаемость и снизит количество ошибок.

Читайте также:  Установить индикатор батареи в ubuntu/linux mint

Используйте $() вместо обратных кавычек «

Обратные кавычки плохо читаются и в некоторых шрифтах легко могут быть перепутаны с одинарными кавычками.
Конструкция $() так же позволяет использовать вложенные вызовы без головной боли с экранированием:

# обе команды выводят: A-B-C-D echo «A-`echo B-`echo C-\`echo D\«`» echo «A-$(echo B-$(echo C-$(echo D)))»

Используйте двойные квадратные скобки [[]] вместо одинарных []

Двойные квадратные скобки позволяют избежать непреднамеренного использования путей вместо переменных:

$ [ a < b ] -bash: b: No such file or directory $ [[ a < b ]]

В некоторых случаях упрощают синтаксис:

[ «${name}» > «a» -o ${name} < "m" ] [[ "${name}" > «a» && «${name}» < "m" ]]

А так же предоставляют дополнительную функциональность:

Новые операторы:

  • || Логическое ИЛИ (logical or) — только с двойными скобками.
  • && Логическое И (logical and) — только с двойными скобками.

Источник: http://itman.in/bash-scripting/

Пишем скрипты в Linux (обучение на примерах)


1. Введение 2. Обучение написанию сценариев на внутреннем языке BASH (Перевод с англ.) 3. Используемая и рекомендуемая литература
Что нужно, чтобы писать скрипты Владение инструментами командной строки и их необходимыми опциями. Базовые знания английского языка уровня начальной школы не помешают.

Зачем нужны скрипты

Во-первых, администрирование linux-сервера в той или иной степени сводится к систематическому выполнению одних и тех же команд. Причем не обязательно, чтобы эти команды выполнял человек.

Их можно запрограммировать на выполнение машиной. Во-вторых, даже просто выполнение обычной задачи, которая (вдруг) составляет 20-1000… однообразных операций ГОРАЗДО проще реализовать в скрипте.

Что такое скрипт

Скрипт — набор инструкций, которые должен в определенном порядке и в определенное время выполнить компьютер. Инструкциями могут быть как внутренние команды оболочки (циклы, условия, обработка текстовой информации, работа с переменными окружения и прочее), так и любая программа, выполняемая нами в консоли с необходимыми параметрами.

Как писать скрипт

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

Если файл сценария начинается с последовательности #!, которая в мире UNIX называется sha-bang, то это указывает системе какой интерпретатор следует использовать для исполнения сценария.

Если это трудно понять, то просто запомните, что все скрипты мы будем начинать писать именно со строчки #!/bin/bash или #!/bin/sh, а далее пойдут команды и комментарии к ним.

Напутствие

Я Вам искренне советую писать как можно больше комментариев чуть ли ни к каждой строчке в скрипте. Пройдет время и Вам понадобится изменить или модернизировать написанный когда-то скрипт. Если не помнишь или не понимаешь, что написано в скрипте, то становится сложно его изменять, проще писать с нуля.

Какие скрипты могут нам понадобиться:

устанавливающий правила файервола при загрузке системы. выполняющий backup настроек и данных.

добавляющий почтовые ящики в почтовый сервер (точнее в базу mysql) запускающий в определенное время (лучше каждую ночь) программу, которая сканирует логи прокси-сервера и выдает удобный web-отчет по количеству скачанного трафика.

отправляющий нам на почту информацию о том, что кто-то получил доступ к нашему серверу по ssh, время подключения и адрес клиента.

О методике написания скриптов

Создаем текстовый файл, редактируем его, устанавливаем права на выполнение, запускаем, смотрим ошибки, исправляем, запускаем, смотрим ошибки… Когда все вылизано и работает правильно, ставим его в автозагрузку либо в планировщик на определенное время. оригинал: http://www.linuxconfig.

org/Bash_scripting_Tutorial

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

Давайте начнем наше обучение с простого сценария, выполняющего вывод строки «Hello World!» (в перев. с англ. — Всем привет!)

Вот ваш первый пример bash-скрипта:
 Переходим в директорию, содержащую наш файл hello_world.sh и делаем его исполняемым:
Запускаем скрипт на выполнение

В данном примере мы объявляем простую переменную и выводим её на экран с помощью команды echo
 Наш архивирующий скрипт с переменными:

Обратите внимание на пробелы в квадратных скобках, без которых условие работать не будет.

Таким образом сначала тело цикла «while» выполняется, т.к. переменная choice изначально равна четырем. Потом читаем в неё пользовательский ввод, и если ввод не равен 1,2 или 3 то делаем нашу переменную снова равную 4, в связи с чем тело цикла повторяется (снова необходимо вводить 1,2 или 3).

Аналогично для примера мы можем использовать «в то время как» петли, чтобы проверить, если файл не существует. Этот сценарий будет спать, пока файл не существует. Обратите внимание на Bash отрицатель «!» что сводит на нет (инвертирует) -e опцию.

Запуск for-цикла из командной строки bash:

В следующем примере условием while-цикла является наличие стандартного ввода.

Тело цикла будет выполняться пока есть чему перенаправляться из стандартного вывода в команду read.

Более подробную информацию можно получить из различных источников, например отсюда

Оригинал

Bash-Prog-Intro
abs-book

Источник: https://ubuntuserveradmin.blogspot.com/2012/12/linux.html

#Linux — Как написать скрипт на Bash

Системные администраторы, работающие в Linux, сталкиваются с периодически повторяющимися задачами.

Например, резервным копированием, установкой программ на новые компьютеры, изменением конфигурационных файлов. Как правило, эти задачи требуют ввода одних и тех же команд.

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

Скрипт — это обычный текстовый файл, содержащий в себе последовательности вызовов разнообразных команд.

Запуск такого сценария осуществляет общую интерпретацию файла и построчное выполнение инструкций.

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

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

Небольшой пример сценария

Ниже приводится пример скрипта, ищущего все файлы журналов в директории /var/log. Если вызов происходит без указания параметров, имена всех журналов записываются в файл log-list.txt, лежащий в домашней директории пользователя. При указании строкового параметра поиск осуществляется по его вхождению в имена файлов. Данный Bash скрипт должен работать одинаково в любом дистрибутиве Linux.

Создайте в директории /usr/local/bin файл с именем findlog и скопируйте в него, приведенный выше программный код.

Файл нужно сделать исполняемым с помощью команды chmod, или нажмите по нему правой кнопкой мыши и зайдите в пункт «свойства».

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

Пояснения к использованию сценариев

Любой скрипт, создаваемый в Linux, должен начинаться со строки определения исполняемой программы. Обратите внимание на первую строчку из примера «#!/bin/bash». Она, по сути, является комментарием, так как начинается со знака решетки, но восклицательный знак говорит терминалу о том, что последующий текст определяет место расположения программы обработчика. В данном случае мы указали место расположения исполняемого файла командного интерпретатора Bash.

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

Мы поместили сценарий в директории /usr/local/bin. Это одна из папок, на которые операционная система обращает особое внимание. При вводе имени команды в окне терминала, ОС просматривает ряд папок на наличие одноименного исполняемого файла.

Если скрипт расположен в какой-либо другой директории, вызвать его можно с помощью прямого обращения. Для этого нужно указать абсолютный или относительный путь до файла. Если файл расположен в текущей директории, обязательным условием является использование конструкции «./имя_скрипта».

Переменная окружения $PATH содержит все системные директории, по которым осуществляется поиск программ. Они разделяются двоеточием. Посмотреть список можно с помощью приведенного ниже примера.

echo $PATH

/home/username/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin: (перенос строки) (продолжение строки) /sbin:/bin:/usr/games:/usr/local/games:/snap/bin

Источник: http://UserPlay.info/help/pomoshch-po-linux/linux-sozdanie-skriptov-bash.html

Краткое введение в программирование на Bash — часть I

Данное введение в программирование на bash прельстило меня своей краткостью и содержательностью. В то же время я изменил некоторые примеры, потому что они делали слегка не то, что ожидается новичками.

Начинающим текст будет полезен как отправная точка для начала написания скриптов. Опытным — как справочник.

Удачного чтения!
Выражаю также благодарность Владимиру Черному (начальнику отдела образовательных проектов ALT Linux) за внесенные в текст правки.

Тема программирования на bash из разряда тех, которые могут быть рассмотрены и в пару, и в сотни страниц. Гарольд Родригес (Harold Rodriguez) объясняет эту тему в приведенном ниже руководстве из двух частей. Его прекрасный и яркий стиль позволил ему охватить все существенные черты программирования на bash буквально на нескольких страницах.

Если вы никогда не программировали на bash ранее — сейчас самое время начать. Даже если у вас мало знаний о том, что такое bash, вы вполне можете посмотреть на множество интересных скриптов, разбираемых Гарольдом.

Введение

Подобно остальным оболочкам, доступным в Linux, Bourne Again shell (bash) является не только, собственно, командной оболочкой, но и языком для написания сценариев (скриптов) (слова «сценарий» и «скрипт» обычно являются синонимами — прим. перев.).

Скрипты позволяют в полной мере использовать возможности оболочки и автоматизировать множество задач, которые иначе потребуют для своего выполнения ввода множества команд. Многие программы, работающие внутри вашего компьютера с Linux — это скрипты. Если вы захотите узнать, как они работают, или изменить их, важно понимать их синтаксис и семантику.

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

Так все-таки программирование (programming) или написание скриптов (scripting)?

Новичков в программировании, как правило, озадачивает разница между, собственно, программированием и языками скриптов. Программы, написанные на каких-то языках программирования, обычно гораздо более мощные по возможностям и работают намного быстрее, чем программы, написанные на языках сценариев. Примеры языков программирования — C, C ++ и Java.

Создание программы на каком-либо языке программирования обычно начинается с написания исходного кода (текстовый файл, содержащий инструкции о том, как будет работать окончательная программа), затем его необходимо скомпилировать (собрать) в исполняемый файл. Этот исполняемый файл не так легко переносить между различными операционными системами.

Например, если вы напишете на программу на C для Linux, вы не сможете запустить ее в Windows. Чтобы сделать это, вам придется перекомпилировать исходный код под Windows. Написание скрипта также начинается с написания исходного кода, который не компилируется в исполняемый файл.

Вместо этого интерпретатор оболочки последовательно читает инструкции в файле исходного кода и выполняет их. К сожалению, поскольку интерпретатор должен читать каждую инструкцию, скорость исполнения скрипта обычно медленнее (намного медленнее — прим. перев.), чем у скомпилированной программы.

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

Bash — это язык сценариев. Он отлично подходит для написания небольших программ, но если вы планируете делать какие-то мощные приложения, выбор для этого какого-либо языка программирования предпочтительнее для вас. Другие примеры скриптовых языков Perl, Lisp, и Tcl.

Что нужно знать для написания своих скриптов?

Для этого необходимо знание основных команд Linux. Например, вы должны знать, как копировать, перемещать и создавать новые файлы. Обязательно умение использовать какой-либо текстовый редактор.

Существуют три основных текстовых редактора в Linux: vi, emacs и pico (автор еще забыл nano, который лучше всего подходит начинающим, если не учитывать еще и mcedit. — Прим. перев.).

Если вы не знакомы с vi или emacs, используйте pico или другой простой в использовании текстовый редактор.

Внимание!!!

Не следует учиться программировать на bash из-под пользователя root! В противном случае — может случиться все что угодно! Я не буду нести никакой ответственности, если вы случайно допустите ошибку и испортите вашу систему.

Вы предупреждены! Используйте учетную запись обычного пользователя без каких-либо привилегий. Вы можете даже создать нового пользователя только для обучения написанию сценариев.

Таким образом, худшее, что произойдет в данном случае — это исчезновение данных в каталоге этого пользователя.

Ваша первая программа на Bash

Нашей первой программой будет классическая «Hello World». Конечно, если уже вы программировали раньше, вы должно быть устали от таких примеров. Однако это — традиция и кто я такой, чтобы менять ее? Программа «Hello World» просто выводит слова «Hello World» на экран. Запустите текстовый редактор и наберите в нем следующее:

#!/bin/bash
echo «Hello World»

Первая строка сообщает Linux использовать интерпретатор bash для запуска этого скрипта. В этом случае, bash находится в каталоге /bin. Если у вас bash находится где-то еще, сделайте соответствующие изменения в данной строке.

Явное указание интерпретатора очень важно, удостоверьтесь еще раз, что указали его, поскольку данная строка говорит Linux какой именно интерпретатор нужно использовать для выполнения инструкций в скрипте. Следующее, что нужно сделать, это сохранить скрипт. Назовем его hello.sh.

После этого вам нужно сделать скрипт исполняемым:

$ chmod u+x hello.sh

Если вы не понимаете, что делает эта команда, прочтите справочную страницу команды chmod:

$ man chmod

Как только это будет сделано, вы сможете запустить программу, просто набрав ее название:

$ ./hello.sh

Hello World

Получилось! Это ваша первая программа! И хотя она скучная и не делает ничего полезного, она показывает как именно все работает. Просто запомните эту простую последовательность действий: напишите код, сохраните файл, сделайте его исполняемым с помощью chmod и запустите.

Команды, команды и команды

Что именно делает ваша первая программа? Она печатает на экран слова «Hello World». Каким образом она это делает? Она использует команды. В нашей программе мы написали только одну команду — echo «Hello World». Что именно тут команда? echo. Эта программа принимает один аргумент и печатает его на экран.

Аргументом является все, что следует после ввода названия программы. В нашем случае «Hello World» это и есть аргумент, переданный команде echo. При вводе команды ls /home/, аргументом команды ls является /home.

Ну и что это все означает? А означает это то, что если у вас есть программа, которая принимает какой-то аргумент и выводит что-то на экран, вы можете использовать ее вместо echo. Предположим, что у нас есть программа под названием foo.

Эта программа будет принимать один аргумент (строку из слов) и печатать их на экран. Тогда мы можем переписать нашу программу вот так:

#!/bin/bash
foo
«Hello World«

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

$ ./hello
Hello World

Точно такой же результат. Использовался ли тут какой-то уникальный код? Нет. Написали ли мы какую-то программу? Нет, если только вы не являетесь автором программы echo. Все, что вы сделали — просто встроили программу echo в наш скрипт и снабдили ее аргументом.

Примером альтернативы использования команды echo в реальном программировании является команда printf, которая имеет больше возможностей, если вы знакомы с программированием на C.

Ну и на самом деле, точно такой же результат можно было бы получить и без написания скрипта:

$ echo «Hello World”
Hello World

Написание скриптов на bash предлагает широкий спектр возможностей и этому легко научиться. Как вы только что могли видеть, вы используете другие команды Linux, чтобы писать ваши собственные скрипты. Ваша программа-оболочка представляет собой несколько других программ, собранных вместе для выполнения какой-либо задачи.

Другие полезные программы

Сейчас мы напишем программу, которая переместит все файлы в каталог, удалит его вместе с содержимым, а затем создаст это каталог заново.

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

Результатом выполнения данной последовательности команд будет чистый каталог, в котором вы работаете. Скорее всего это будет ваша домашняя директория. Поэтому, если вы НЕ хотите удаления всех файлов в ней — НЕ выполняйте команды из оригинала статьи.

А лучше последуйте совету автора и создайте отдельного пользователя специально для тренировки написания скриптов. Этот пример я немного расширил и теперь он не такой опасный. Прим. перев.):

$ touch file1

$ mkdir trash
$ mv
file1trash $ rm -rf trash

$ mkdir trash

Вместо того, чтобы вводить это все в интерактивном режиме, напишем скрипт, выполняющий эти команды:

#!/bin/bash

touch file1 mkdir trash

mv

file1trash rm -rf trash mkdir trash

echo “

Файл удален!

Сохраните его под именем clean.sh и теперь все, что нужно сделать — это запустить его. Он переместит все файлы в каталог, удалит его, создаст его заново каталог и даже напечатает сообщение об удалении файлов. Запомните, если вы обнаружите, что регулярно делаете нечто требующее набора одной и той же последовательности команд — это вполне можно автоматизировать написанием скрипта.

Источник: http://tux-the-penguin.blogspot.com/2010/10/bash-1.html

Ссылка на основную публикацию