bash передать параметр в скрипт

Разбираемся с аргументами в Bash-скриптах

Перевод статьи «Handling Arguments in Bash Scripts».

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

Позиционные и специальные параметры

Bash предоставляет нам переменные, которые присутствуют в любом написанном нами скрипте. Вот несколько самых полезных:

Позиционные параметры содержат значения, которые вы указываете при запуске своего скрипта (в командной строке) в качестве аргументов. Рассмотрим пример. Допустим, у вас есть скрипт, запускающийся следующим образом:

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

и все равно все бы прекрасно работало.

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

Когда я запускаю скрипт вот так:

он генерирует структуру директорий:

$0: имя скрипта

Вот что получится при запуске:

$#: число аргументов

$?: последний код возврата

Вот пример использования в скрипте:

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

Если вы НЕ берете эти переменные в кавычки, они делают одно и то же: вставляют в указанное место все переданные в скрипт аргументы.

При запуске получим следующее:

Переходим к самому интересному: возьмем переменные в кавычки.

Видите? Один аргумент! Хотите самостоятельно реализовать echo?

Итоги

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

Источник

Как передать переменные (параметры) из одного BASH-скрипта другому скрипту

bash передать параметр в скрипт. 304. bash передать параметр в скрипт фото. bash передать параметр в скрипт-304. картинка bash передать параметр в скрипт. картинка 304. Перевод статьи «Handling Arguments in Bash Scripts».

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

Вызов BASH-скрипта с параметрами командной строки

Наиболее распространённый способ передачи данных сценариям, написанных на BASH, заключается в использовании параметров командной строки. Вызвав сценарий с параметрами, мы передаём ему ту информацию, которую он может обработать. Вызов BASH-скрипта с параметрами командной строки может выглядеть так:

Таким образом, мы передали 4 параметра скрипту. Посмотрим, как работает передача парамтров в BASH и как работать с переданными (полученными) параметрами.

Чтение параметров командной строки в BASH-скрипте

При запуске BASH-скрипта с параметрами, эти параметры помещаются в специальные переменные, которые также называют позиционными параметрами:

Посмотрим на примере, написав простой скрипт:

Результатом его работы будут следующие данные:

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

То получим её значение, которое попадёт во второй позиционный параметр:

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

Для того, чтобы передать значение в переменной с пробелами, её нужно заключить между двумя двойными кавычками. В нашем примере так «$number»

Проверка параметров, передаваемых BASH-скрипту

Для того, чтобы передаваемые данные соответствовали ожидаемым, хорошо бы их до начала обработки проверить. Пожалуй, самым важным вопросом проверки является проверка вообще на формальное наличие (пользователь может просто ничего не ввести). Усложним немного наш скрипт и вставим в него проверку наличия данных, передаваемых BASH-скрипту:

Подсчёт количества параметров, передаваемых BASH-скрипту

Ну и получим ожидаемый результат:

Как узнать значение последнего параметра, передаваемого BASH-скрипту

Результатом выполнения будет следующее:

Резюме

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

Видео, иллюстрирующие примеры использования передачи параметров в BASH-скрипт и получение значений после выполнения отдельного скрипта на BASH

Источник

Аргументы командной строки Bash

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

В этой статье будет рассмотрено, как принимать аргументы командной строки bash, способы его обработки, проверка опций, а также известные особенности при работе с ними.

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

Интерпретатор Bash присваивает специальным переменным все параметры, введённые в командной строке. В их состав включено название сценария, выполняемого интерпретатором. Такие переменные называются ещё числовыми переменными, так как в их названии содержится число:

Ниже приведён пример использования одного параметра скрипта Bash:

#!/bin/bash
factorial=1
for (( number = 1; number

Результат работы кода:

bash передать параметр в скрипт. test1. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test1. картинка bash передать параметр в скрипт. картинка test1. Перевод статьи «Handling Arguments in Bash Scripts».

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

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

Пример работы кода:

bash передать параметр в скрипт. test2. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test2. картинка bash передать параметр в скрипт. картинка test2. Перевод статьи «Handling Arguments in Bash Scripts».

Командный интерпретатор присвоил числа 5 и 10 соответствующим переменным — $1 и $2.

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

Пример работы кода:

bash передать параметр в скрипт. test3. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test3. картинка bash передать параметр в скрипт. картинка test3. Перевод статьи «Handling Arguments in Bash Scripts».

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

Если необходимо использовать больше 9 параметров для скрипта, то названия переменных немного изменятся. Начиная с десятой переменной, число, стоящее после знака $, необходимо заключать в квадратные скобки (без внутренних пробелов):

Пример работы кода:

bash передать параметр в скрипт. test4. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test4. картинка bash передать параметр в скрипт. картинка test4. Перевод статьи «Handling Arguments in Bash Scripts».

Получение названия скрипта Bash

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

Пример работы кода:

bash передать параметр в скрипт. test5. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test5. картинка bash передать параметр в скрипт. картинка test5. Перевод статьи «Handling Arguments in Bash Scripts».

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

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

Для этого специально предусмотрена небольшая команда. Команда basename возвращает только название скрипта без абсолютного или относительного пути к нему:

Результат работы кода:

bash передать параметр в скрипт. test5b 1. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test5b 1. картинка bash передать параметр в скрипт. картинка test5b 1. Перевод статьи «Handling Arguments in Bash Scripts».

Проверка параметров скрипта

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

Если попробовать запустить написанный ранее скрипт test2 без аргументов, то перед выводом команд echo будет отображена ошибка:

bash передать параметр в скрипт. test2 error. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test2 error. картинка bash передать параметр в скрипт. картинка test2 error. Перевод статьи «Handling Arguments in Bash Scripts».

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

Пример работы кода:

bash передать параметр в скрипт. test7. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test7. картинка bash передать параметр в скрипт. картинка test7. Перевод статьи «Handling Arguments in Bash Scripts».

В данном случае использовалась опция -n из предыдущей статьи о сравнении строк в Bash для проверки на наличие значения в переменной, которая считала параметр.

Обработка неизветсного числа параметров

Для начала рассмотрим один из часто используемых инструментов при работе с параметрами Bash — команду shift. Её прямое назначение заключается в сдвиге параметров на одну позицию влево. Таким образом, значение из переменной $3 переместится в $2, а из $2 — в $1. Но из $1 значение просто отбросится и не сместится в $0, так как там неизменно хранится название запущенной программы.

Эта команда является эффективным способом обработки всех параметров, переданных сценарию, особенно, когда нельзя заранее узнать их количество. Достаточно лишь обработать $1, сделать сдвиг и повторить процедуру.

Пример работы кода:

bash передать параметр в скрипт. test13. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test13. картинка bash передать параметр в скрипт. картинка test13. Перевод статьи «Handling Arguments in Bash Scripts».

Этот скрипт выполняет цикл while, в условии которого указана проверка первого параметра на длину. И если она равна нулю, цикл прерывает свою работу. При положительном результате проверки команда shift сдвигает все параметры влево на одну позицию.

Ещё один вариант использование shift — смещать на несколько позиций. Для этого достаточно через пробел указать количество, на которое будет смещён ряд параметров скрипта.

Пример работы скрипта:

bash передать параметр в скрипт. test14. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test14. картинка bash передать параметр в скрипт. картинка test14. Перевод статьи «Handling Arguments in Bash Scripts».

На заметку: при использовании shift нужно быть осторожным, ведь сдвинутые за пределы $1 параметры не восстанавливаются в период работы программы.

Обработка опций в Bash

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

По примеру выше можно применять shift для обработки простых опций. С помощью инструкции case можно определять, являются ли аргументы Bash опциями:

Пример работы программы:

bash передать параметр в скрипт. test15. bash передать параметр в скрипт фото. bash передать параметр в скрипт-test15. картинка bash передать параметр в скрипт. картинка test15. Перевод статьи «Handling Arguments in Bash Scripts».

Блок case работает правильно вне зависимости от того, как расположены аргументы командной строки bash.

Выводы

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

Команда basename используется для обрезания пути запущенного сценария, что часто необходимо для создания гибких программ. Использование команды shift позволяет эффективно проходить по переданным скрипту параметрам, особенно когда их количество неизвестно.

Источник

Bash-скрипты, часть 6: функции и разработка библиотек

Занимаясь разработкой bash-скриптов, вы рано или поздно столкнётесь с тем, что вам периодически приходится использовать одни и те же фрагменты кода. Постоянно набирать их вручную скучно, а копирование и вставка — не наш метод. Как быть? Хорошо бы найти средство, которое позволяет один раз написать блок кода и, когда он понадобится снова, просто сослаться на него в скрипте.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

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

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Объявление функций

Функцию можно объявить так:

Функцию можно вызвать без аргументов и с аргументами.

Использование функций

Напишем скрипт, содержащий объявление функции и использующий её:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Результаты вызова функции

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

Как и ожидается, ничего хорошего после его запуска не произошло.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Попытка воспользоваться функцией до её объявления

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

Как видно, новая функция преспокойно затёрла старую.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Использование команды return

Команда return позволяет задавать возвращаемый функцией целочисленный код завершения. Есть два способа работы с тем, что является результатом вызова функции. Вот первый:

Команда echo вывела сумму введённого числа и числа 10.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Вывод значения, возвращаемого функцией

Учтите, что максимальное число, которое может вернуть команда return — 255. Если функция должна возвращать большее число или строку, понадобится другой подход.

Запись вывода функции в переменную

Ещё один способ возврата результатов работы функции заключается в записи данных, выводимых функцией, в переменную. Такой подход позволяет обойти ограничения команды return и возвращать из функции любые данные. Рассмотрим пример:

Вот что получится после вызова данного скрипта.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Запись результатов работы функции в переменную

Аргументы функций

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

Аргументы передают функции, записывая их после её имени:

Вот пример, в котором функция вызывается с аргументами и занимается их обработкой:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Вызов функции с аргументами

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

При его запуске, а точнее, при вызове объявленной в нём функции, будет выведено сообщение об ошибке.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Функция не может напрямую использовать параметры, переданные сценарию

Вместо этого, если в функции планируется использовать параметры, переданные скрипту при вызове из командной строки, надо передать их ей при вызове:

Теперь всё работает правильно.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Передача функции параметров, с которыми запущен скрипт

Работа с переменными в функциях

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

Существуют два вида переменных:

▍Глобальные переменные

Глобальные переменные — это переменные, которые видны из любого места bash-скрипта. Если вы объявили глобальную переменную в основном коде скрипта, к такой переменной можно обратиться из функции.

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

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

Вот что выведет этот сценарий.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Обращение к глобальной переменной из функции

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

Что если такое поведение нас не устраивает? Ответ прост — надо использовать локальные переменные.

▍Локальные переменные

Переменные, которые объявляют и используют внутри функции, могут быть объявлены локальными. Для того, чтобы это сделать, используется ключевое слово local перед именем переменной:

Если за пределами функции есть переменная с таким же именем, это на неё не повлияет. Ключевое слово local позволяет отделить переменные, используемые внутри функции, от остальных переменных. Рассмотрим пример:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Локальная переменная в функции

Передача функциям массивов в качестве аргументов

Попробуем передать функции в качестве аргумента массив. Сразу хочется сказать, что работать такая конструкция будет неправильно:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Неправильный подход к передаче функциям массивов

Как видно из примера, при передаче функции массива, она получит доступ лишь к его первому элементу.

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

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Сборка массива внутри функции

Как видно из примера, функция собрала массив из переданных ей аргументов.

Рекурсивные функции

Рекурсия — это когда функция сама себя вызывает. Классический пример рекурсии — функция для вычисления факториала. Факториал числа — это произведение всех натуральных чисел от 1 до этого числа. Например, факториал 5 можно найти так:

Если формулу вычисления факториала написать в рекурсивном виде, получится следующее:

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

Проверим, верно ли работает этот скрипт.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Как видите, всё работает как надо.

Создание и использование библиотек

Итак, теперь вы знаете, как писать функции и как вызывать их в том же скрипте, где они объявлены. Что если надо использовать функцию, тот блок кода, который она собой представляет, в другом скрипте, не используя копирование и вставку?

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

У команды source есть псевдоним — оператор «точка». Для того, чтобы подключить файл в скрипте, в скрипт надо добавить конструкцию такого вида:

Это — библиотека. Воспользуемся ей в сценарии:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Только что мы использовали библиотечную функцию внутри скрипта. Всё это замечательно, но что если мы хотим вызвать функцию, объявленную в библиотеке, из командной строки?

Вызов bash-функций из командной строки

Теперь функцию можно вызывать прямо из командной строки:

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Вызов функции из командной строки

Ещё приятнее то, что такая вот библиотека оказывается доступной всем дочерним процессам оболочки, то есть — ей можно пользоваться в bash-скриптах, не заботясь о подключении к ним этой библиотеки.

Тут стоит отметить, что для того, чтобы вышеприведённый пример заработал, может понадобиться выйти из системы, а потом войти снова. Кроме того, обратите внимание на то, что если имя функции из библиотеки совпадёт с именем какой-нибудь стандартной команды, вместо этой команды будет вызываться функция. Поэтому внимательно относитесь к именам функций.

Итоги

На сегодня это всё. В следующий раз поговорим об утилите sed — мощном средстве обработки строк.

bash передать параметр в скрипт. image loader. bash передать параметр в скрипт фото. bash передать параметр в скрипт-image loader. картинка bash передать параметр в скрипт. картинка image loader. Перевод статьи «Handling Arguments in Bash Scripts».

Уважаемые читатели! А вы пользуетесь функциями собственной разработки для решения повседневных задач?

Источник

Titiaiev / bash-guide-1.md

Бесплатная книга-сайт на русском, полный гайд
Advanced Bash-Scripting Guide

BASH — Bourne-Again SHell (что может переводится как «перерожденный шел», или «Снова шел Борна(создатель sh)»), самый популярный командный интерпретатор в юниксоподобных системах, в особенности в GNU/Linux. Ниже приведу ряд встроенных команд, которые мы будем использовать для создания своих скриптов.

break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.

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

Что необходимо знать с самого начала

в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash ) поменяйте её на ваш путь.

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

Приведу как пример небольшой пример, который мы разберем:

Результат выполнения скрипта:

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

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

#!/bin/bash
#в переменную source засовываем первый параметр скрипта
source=$1
#в переменную dest засовываем второй параметр скрипта
dest=$2

Результат выполнения скрипта:

Структура if-then-else используется следующим образом:

для построения многоярусных условий вида:

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

Условия. Множественный выбор

Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.

esac #окончание оператора case.

После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )

Прведу список логических операторв, которые используются для конструкции if-then-else-fi:

-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( # меньше
-le,( # меньше или равно
-gt,(>) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»

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

Оператор for-in предназначен для поочередного обращения к значениям перечисленным в списке. Каждое значение поочередно в списке присваивается переменной.
Синтаксис следующий:

Рассмотрим небольшой пример:

Цикл while сложнее цикла for-in и используется для повторения команд, пока какое-то выражение истинно( код возврата = 0).
Синтаксис оператора следующий:

Пример работы цикла рассмотрим на следующем примере:

А теперь результат работы скрипта:

Как видим цикл выполняется до тех пор, пока мы не введем что-то отличное от «yes». Между do и done можно описывать любые структуры, операторы и т.п., все они будут выполнятся в цикле.Но следует быть осторожным с этим циклом, если вы запустите на выполнение в нём какую-либо команду, без изменения переменной выражения, вы можете попасть в бесконечный цикл.

Рассмотрим еще один пример, я взял его из книги Advanced Bash Scripting. Уж очень он мне понравился :), но я его немного упростил. В этом примере мы познакомимся с еще одним типом циклов UNTIL-DO. Эта практически полный аналог цикла WHILE-DO, только выполняется пока какое-то выражение ложно.
Вот пример:

Результат выполнения скрипта:

Ну вот, как видите ничего сложного, список математических операций стандартный:

+ — сложение
— — вычитание
* — умножение
/ — деление
** — возведение в степень
% — модуль(деление по модулю), остаток от деления
let позволяет использовать сокращения арифметических команд, тем самым сокращая кол-во используемых переменных. Например: a = a+b эквивалентно a +=b и т.д

Работа с внешними программами при написании shell-скриптов

Для начала немного полезной теории.

Если есть необходимость дописывать в файл(при использовании » > » он заменятеся), необходимо вместо » > » использовать » >> «

после просьбы sudo ввести пароль, он возьмется из файла my_password, как будто вы его ввели с клавиатуры.
Если необходимо записать в файл только ошибки, которые могли возникнуть при работе программы, то можно использовать:

символ » & » означает указатель на дескриптор 1(stdout)
(Поумолчанию stderr пишет на ту консоль, в котрой работает пользователь(вренее пишет на дисплей)).

Конвеер — очень мощный инструмент для работы с консолью Bash. Синтаксис простой:
команда1 | команда 2 — означает, что вывод команды 1 передастся на ввод команде 2
Конвееры можно группировать в цепочки и выводить с помощью перенаправления в файл, например:

Чаще всего скрипты на Bash используются в качестве автоматизации каких-то рутинных операций в консоли, отсюда иногда возникает необходимость в обработке stdout одной команды и передача на stdin другой команде, при этом результат выполнения одной команды должен быть неким образом обработан. В этом разделе я постораюсь объяснить основные принципы работы с внешними командами внутри скрипта. Думаю что примеров я привел достаточно и можно теперь писать только основные моменты.

1. Передача вывода в переменную.

Для того чтобы записать в переменную вывод какой-либо команды, достаточно заключить команду в « ковычки, например

Результат работы: qwerty

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

Источник

Добавить комментарий

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