- Как передать аргументы скрипту Bash
- Команды, синтаксис и примеры
- Пример передачи аргументов в скрипте Bash
- Флаги Метод
- Значения для двоеточий
- Основы Bash-скриптинга для непрограммистов. Часть 2
- Скрипты
- Разбираемся с аргументами в Bash-скриптах
- Позиционные и специальные параметры
- $1, $2, $3, …: позиционные параметры
- $0: имя скрипта
- $#: число аргументов
- $?: последний код возврата
- $@ and $*: все аргументы
- Итоги
- Как передать переменные (параметры) из одного BASH-скрипта другому скрипту
- Вызов BASH-скрипта с параметрами командной строки
- Чтение параметров командной строки в BASH-скрипте
- Проверка параметров, передаваемых BASH-скрипту
- Подсчёт количества параметров, передаваемых BASH-скрипту
- Как узнать значение последнего параметра, передаваемого BASH-скрипту
- Резюме
- Видео, иллюстрирующие примеры использования передачи параметров в BASH-скрипт и получение значений после выполнения отдельного скрипта на BASH
Как передать аргументы скрипту Bash
Команды, синтаксис и примеры
Напишите сценарий bash, чтобы он получал аргументы, которые указываются при вызове сценария из командной строки. Используйте этот метод, когда сценарий должен выполнять немного другую функцию в зависимости от значений входных параметров, также называемых аргументами.
Пример передачи аргументов в скрипте Bash
Скажем, у вас есть скрипт stats.sh, который считает слова в файле. Если вы хотите использовать этот сценарий для многих файлов, лучше передать имя файла в качестве аргумента, чтобы один и тот же сценарий можно было использовать для всех файлов, которые будут обрабатываться. Например, если имя файла для обработки – список песен, введите в командной строке следующее:
Доступ к аргументам осуществляется внутри скрипта с использованием переменных $ 1 , $ 2 , $ 3 и т. Д. Переменная $ 1 ссылается на первый аргумент, $ 2 – на второй аргумент, а $ 3 – на третий аргумент. Это иллюстрируется в следующем примере:
Для удобства чтения назначьте переменную с описательным именем значению первого аргумента ( $ 1 ), а затем вызовите утилиту подсчета слов (wc) для переменной $ FILE1 ,
Если у вас есть переменное число аргументов, используйте переменную $ @ , которая является массивом всех входных параметров. Это использует цикл for для итеративной обработки каждого из них, как показано в следующем примере:
Вот пример того, как вызвать этот скрипт с аргументами из командной строки:
Если аргумент имеет пробелы, заключите его в одинарные кавычки. Например:
Флаги Метод
Часто сценарий написан так, что аргументы могут быть переданы в любом порядке с использованием флагов. С помощью метода flags некоторые аргументы можно сделать необязательными.
Например, вы хотите написать скрипт, который извлекает информацию из базы данных на основе указанных параметров, таких как имя пользователя , дата и product , и генерирует отчет в указанном формате. Сценарий должен быть написан таким образом, чтобы эти параметры передавались при вызове сценария. Это может выглядеть так:
Bash включает эту функцию с помощью функции getopts. Для приведенного выше примера используйте getopts следующим образом:
Это цикл while, который использует функцию getopts и так называемую строку опций – в данном случае u: d: p: f: – для итерации аргументов. Цикл while проходит по строке optstring, которая содержит флаги, используемые для передачи аргументов, и присваивает значение аргумента, предоставленное для этого флага, переменной option . Затем оператор CASE присваивает значение переменной option глобальной переменной, которая используется после прочтения всех аргументов.
Значения для двоеточий
Двоеточие в строке опций означает, что значения необходимы для соответствующих флагов. В приведенном выше примере u: d: p: f: за всеми флагами следует двоеточие. Это означает, что все флаги нуждаются в значении. Если, например, флаги d и f , как ожидается, не будут иметь значения, строкой опций будет u: dp: f .
Двоеточие в начале строки опций (например, : u: d: p: f: ) имеет совершенно другое значение. Он обрабатывает флаги, которые не представлены в строке optstring. В этом случае значение переменной option установлено в ? и значение OPTARG устанавливается на неожиданный флаг. Это отображает подходящее сообщение об ошибке, информирующее вас об ошибке.
Аргументы, которым не предшествует флаг, игнорируются getopts. Если флаги, указанные в строке опций, не предоставляются при вызове скрипта, то ничего не происходит, если вы специально не обработаете этот случай в своем коде. Любые аргументы, не обрабатываемые getops, могут по-прежнему регистрироваться с помощью обычных переменных $ 1 , $ 2 и $ 3 .
Источник
Основы Bash-скриптинга для непрограммистов. Часть 2
В первой части статьи мы рассмотрели командные оболочки, профили, синонимы и первые команды. Под спойлером я также рассказал, как развернуть тестовую виртуальную машину.
В этой части речь пойдет о файлах скриптов, их параметрах и правах доступа. Также я расскажу про операторы условного выполнения, выбора и циклы.
Скрипты
Для выполнения нескольких команд одним вызовом удобно использовать скрипты. Скрипт – это текстовый файл, содержащий команды для shell. Это могут быть как внутренние команды shell, так и вызовы внешних исполняемых файлов.
Как правило, имя файла скрипта имеет окончание .sh, но это не является обязательным требованием и используется лишь для того, чтобы пользователю было удобнее ориентироваться по имени файла. Для интерпретатора более важным является содержимое файла, а также права доступа к нему.
Перейдем в домашнюю директорию командой cd
и создадим в ней с помощью редактора nano ( nano script.sh )файл, содержащий 2 строки:
Чтобы выйти из редактора nano после набора текста скрипта, нужно нажать Ctrl+X, далее на вопрос «Save modified buffer?» нажать Y, далее на запрос «File Name to Write:» нажать Enter. При желании можно использовать любой другой текстовый редактор.
Скрипт запускается командой ./ , т.е. ./ перед именем файла указывает на то, что нужно выполнить скрипт или исполняемый файл, находящийся в текущей директории. Если выполнить команду script.sh , то будет выдана ошибка, т.к. оболочка будет искать файл в директориях, указанных в переменной среды PATH, а также среди встроенных команд (таких, как, например, pwd):
Ошибки не будет, если выполнять скрипт с указанием абсолютного пути, но данный подход является менее универсальным: /home/user/script.sh . Однако на данном этапе при попытке выполнить созданный файл будет выдана ошибка:
Проверим права доступа к файлу:
Из вывода команды ls видно, что отсутствуют права на выполнение. Рассмотрим подробнее на картинке:
Права доступа задаются тремя наборами: для пользователя, которому принадлежит файл; для группы, в которую входит пользователь; и для всех остальных. Здесь r, w и x означают соответственно доступ на чтение, запись и выполнение.
В нашем примере пользователь (test) имеет доступ на чтение и запись, группа также имеет доступ на чтение и запись, все остальные – только на чтение. Эти права выданы в соответствии с правами, заданными по умолчанию, которые можно проверить командой umask -S . Изменить права по умолчанию можно, добавив вызов команды umask с нужными параметрами в файл профиля пользователя (файл
/.profile), либо для всех пользователей в общесистемный профиль (файл /etc/profile).
Для того, чтобы установить права, используется команда chmod . Например, чтобы выдать права на выполнение файла всем пользователям, нужно выполнить команду:
Чтобы выдать права на чтение и выполнение пользователю и группе:
Чтобы запретить доступ на запись (изменение содержимого) файла всем:
Также для указания прав можно использовать маску. Например, чтобы разрешить права на чтение, запись, выполнение пользователю, чтение и выполнение группе, и чтение – для остальных, нужно выполнить:
Будут выданы права -rwxr-xr— :
Указывая 3 цифры, мы задаем соответствующие маски для каждой из трех групп. Переведя цифру в двоичную систему, можно понять, каким правам она соответствует. Иллюстрация для нашего примера:
Символ – перед наборами прав доступа указывает на тип файла ( – означает обычный файл, d – директория, l – ссылка, c – символьное устройство, b – блочное устройство, и т. д.). Соответствие числа, его двоичного представления и прав доступ можно представить в виде таблицы:
Источник
Разбираемся с аргументами в Bash-скриптах
Перевод статьи «Handling Arguments in Bash Scripts».
Создание Bash-скриптов для автоматизации набора команд — первый шаг на пути к созданию инструментов, облегчающих вашу жизнь. Даже простые скрипты, читающиеся сверху вниз и запускающиеся по установленному графику, способны сэкономить вам массу времени. Но рано или поздно наступит момент, когда вы захотите настраивать поведение вашего скрипта на лету: создавать директории с нужными вам именами, загружать файлы из определенных git-репозиториев, указывать IP-адреса или порты и т. п. Вот здесь вам и пригодятся аргументы скриптов.
Позиционные и специальные параметры
Bash предоставляет нам переменные, которые присутствуют в любом написанном нами скрипте. Вот несколько самых полезных:
$1, $2, $3, …: позиционные параметры
Позиционные параметры содержат значения, которые вы указываете при запуске своего скрипта (в командной строке) в качестве аргументов. Рассмотрим пример. Допустим, у вас есть скрипт, запускающийся следующим образом:
Переменная $1 будет содержать значение «200», а переменная $2 — значение «goats».
Я использую позиционные параметры в одном из своих простейших скриптов. Этот скрипт я запускаю на работе практически ежедневно (здесь показываю упрощенный вариант):
Как видите, я беру позиционную переменную $1 и сохраняю ее значение в настоящей именованной переменной. Но делать так не обязательно. Я мог бы написать
и все равно все бы прекрасно работало.
Тем не менее, я предпочитаю сохранять позиционные параметры в именованные переменные вверху своего скрипта. Таким образом любой читатель моего скрипта сможет быстро понять, что к чему. Разумеется, это не заменяет хорошую документацию и надежную обработку ошибок, но это приятный маленький бонус в плане читаемости. Подобные вещи хоть немножко, но помогают, так что это хорошая практика.
Когда я запускаю скрипт вот так:
он генерирует структуру директорий:
$0: имя скрипта
В позиционной переменной $0 при вызове скрипта сохраняется его имя. Это особенно полезно для вывода сообщений о том, как нужно использовать этот скрипт.
Вот что получится при запуске:
$#: число аргументов
Кроме позиционных параметров в Bash есть еще и специальные. Переменная $# хранит количество аргументов, переданных через командную строку. Это очень пригождается в обработке ошибок. Что произойдет, если наш скрипт не получит нужных ему аргументов? Давайте обновим скрипт из предыдущего примера и добавим обработку ошибок.
$?: последний код возврата
Лично я нечасто пользуюсь этим специальным параметром в скриптах, зато интенсивно использую его в командной строке. Многие команды, когда их выполнение проваливается, не выводят никаких сообщений. Они просто ничего не делают. Как же вам узнать, успешно ли отработала команда? Можно вывести значение переменной $? , в которой сохраняется код возврата последней запускавшейся команды.
Вот пример использования в скрипте:
$@ and $*: все аргументы
Кажется, именно эти переменные вызывают больше всего сложностей у новичков в Bash — и это понятно! Они работают практически одинаково, но разница в их действии может быть очень существенной в каждой отдельной ситуации.
Если вы НЕ берете эти переменные в кавычки, они делают одно и то же: вставляют в указанное место все переданные в скрипт аргументы.
При запуске получим следующее:
Обратите внимание на аргумент «dooby doo» . Он был взят в кавычки при передаче, но в результате разбился по пробелу на два разных аргумента. Порой это именно то, что нужно, но очень часто — нет.
Переходим к самому интересному: возьмем переменные в кавычки.
Если взять в кавычки $* , в выводе вы получите все аргументы в одной строке. Аргументы будут разделены пробелами и фактически станут одним аргументом. Причем это не зависит от того, были ли они заключены в кавычки при вводе.
Примечание. На самом деле аргументы разделяются $IFS («внутренним разделителем полей»). Обычно это пробел, но стоит знать, что так бывает не всегда.
Видите? Один аргумент! Хотите самостоятельно реализовать echo?
А вот когда вы берете в кавычки $@ , Bash выводит все аргументы так, как они были переданы изначально. Это, на мой взгляд, самый полезный функционал, потому что позволяет передавать все аргументы подкомандам, сохраняя при этом пробелы и кавычки и не позволяя автоматическому разделению строк Bash все испортить.
Вы часто увидите это в скриптах, содержащих множество функций. Традиционно, если у вас много функций, вы делаете последнюю функцию в скрипте функцией main . Она будет обрабатывать все аргументы и содержать организационную логику скрипта. А для запуска функции main обычно последней строчкой скрипта идет main «$@» . Вот так:
Итоги
Надеюсь, теперь вы начинаете понимать силу кастомизации. Используя скрипты Bash, вы можете автоматизировать выполнение многих задач. А благодаря возможности передачи аргументов при вызове скрипта вы можете автоматически выполнять даже те задачи, логика которых зависит от ситуации!
Источник
Как передать переменные (параметры) из одного BASH-скрипта другому скрипту
Вопрос о том, как сделать работу с кодом программ на языке BASH удобнее, всегда актуален. В этой статье рассмотрим, как передать значения переенных из одного BASH-скрипта другому скрипту. Это может потребоваться, например, для написания шаблонов, которые удобно хранить в отдельных файлах, но работа которых требует подстановки данных, полученных от родительского скрипта. Для этого нужно понять довольно простую концепцию того, как передаются параметры командной строки в Bash-скриптах.
Вызов BASH-скрипта с параметрами командной строки
Наиболее распространённый способ передачи данных сценариям, написанных на BASH, заключается в использовании параметров командной строки. Вызвав сценарий с параметрами, мы передаём ему ту информацию, которую он может обработать. Вызов BASH-скрипта с параметрами командной строки может выглядеть так:
Таким образом, мы передали 4 параметра скрипту. Посмотрим, как работает передача парамтров в BASH и как работать с переданными (полученными) параметрами.
Чтение параметров командной строки в BASH-скрипте
При запуске BASH-скрипта с параметрами, эти параметры помещаются в специальные переменные, которые также называют позиционными параметрами:
- в переменную $0 попадает имя вызываемого скрипта
- в переменную $1 попадает первый параметр
- в переменную $2 попадает второй параметр
- . и так далее, до
- в переменную $9 попадает девятый параметр
Посмотрим на примере, написав простой скрипт:
Результатом его работы будут следующие данные:
Как видно, если передавать переменную, значение которой не определено, этот параметр просто не учитывается и не попадает в позиционные параметры. Однако, это должно сработать, если назначить этой переменной значение:
То получим её значение, которое попадёт во второй позиционный параметр:
Важное замечание:
Передаваемые значения не должны иметь пробелов, так как пробелы используются в качестве разделителя передаваемых BASH-скрипту переменных!
Для того, чтобы передать значение в переменной с пробелами, её нужно заключить между двумя двойными кавычками. В нашем примере так «$number»
Важное замечание:
Если BASH-скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например: $
Проверка параметров, передаваемых BASH-скрипту
Для того, чтобы передаваемые данные соответствовали ожидаемым, хорошо бы их до начала обработки проверить. Пожалуй, самым важным вопросом проверки является проверка вообще на формальное наличие (пользователь может просто ничего не ввести). Усложним немного наш скрипт и вставим в него проверку наличия данных, передаваемых BASH-скрипту:
Теперь, если на входе скрипта есть хотя бы один параметр, будет выполняться блок then , если никаких параметров не передаётся, то выводятся данные из блока else . Всё логично:
Подсчёт количества параметров, передаваемых BASH-скрипту
Иногда требуется точно знать, сколько параметров передано BASH-скрипту на вход. И для того, чтобы это узнать, есть простое решение. Количество параметров, передаваемых BASH-скрипту хранится в переменной $# . Ещё немного расширим нашу программу:
Ну и получим ожидаемый результат:
Как узнать значение последнего параметра, передаваемого BASH-скрипту
И последний вопрос, который рассмотрим в этой статье, это как узнать значение последнего параметра, передаваемого BASH-скрипту сразу (без перебора, подсчёта и разбора). В этом вопросе нам выручит как раз переменная $# , указывающая порядковый номер последнего параметра. А зная номер параметра, можно сразу получить его значение в переменной $ . На практике выглядит это так:
Результатом выполнения будет следующее:
Резюме
На этом пожалуй можно остановится. Полученных знаний должно хватить для того, чтобы суметь передать параметры из одного BASH-скрипта другому или прямо на вход скрипту.
Видео, иллюстрирующие примеры использования передачи параметров в BASH-скрипт и получение значений после выполнения отдельного скрипта на BASH
Источник