- Основы BASH. Часть 1
- Введение
- Что необходимо знать с самого начала
- Переменные и параметры скрипта
- Условия
- Условия. Множественный выбор
- Разбираемся с аргументами в Bash-скриптах
- Позиционные и специальные параметры
- $1, $2, $3, …: позиционные параметры
- $0: имя скрипта
- $#: число аргументов
- $?: последний код возврата
- $@ and $*: все аргументы
- Итоги
- Как передать переменные (параметры) из одного BASH-скрипта другому скрипту
- Вызов BASH-скрипта с параметрами командной строки
- Чтение параметров командной строки в BASH-скрипте
- Проверка параметров, передаваемых BASH-скрипту
- Подсчёт количества параметров, передаваемых BASH-скрипту
- Как узнать значение последнего параметра, передаваемого BASH-скрипту
- Резюме
- Видео, иллюстрирующие примеры использования передачи параметров в BASH-скрипт и получение значений после выполнения отдельного скрипта на BASH
Основы BASH. Часть 1
Введение
break выход из цикла for, while или until
continue выполнение следующей итерации цикла for, while или until
echo вывод аргументов, разделенных пробелами, на стандартное устройство вывода
exit выход из оболочки
export отмечает аргументы как переменные для передачи в дочерние процессы в среде
hash запоминает полные имена путей команд, указанных в качестве аргументов, чтобы не искать их при следующем обращении
kill посылает сигнал завершения процессу
pwd выводит текущий рабочий каталог
read читает строку из ввода оболочки и использует ее для присвоения значений указанным переменным.\
return заставляет функцию оболочки выйти с указанным значением
shift перемещает позиционные параметры налево
test вычисляет условное выражение
times выводит имя пользователя и системное время, использованное оболочкой и ее потомками
trap указывает команды, которые должны выполняться при получении оболочкой сигнала
unset вызывает уничтожение переменных оболочки
wait ждет выхода из дочернего процесса и сообщает выходное состояние.
И конечно же кроме встроенных команд мы будем использовать целую кучу внешних, отдельных команд-программ, с которыми мы познакомимся уже в процессе
Что необходимо знать с самого начала
1. Любой bash-скрипт должен начинаться со строки:
#!/bin/bash
в этой строке после #! указывается путь к bash-интерпретатору, поэтому если он у вас установлен в другом месте(где, вы можете узнать набрав whereis bash) поменяйте её на ваш путь.
2. Коментарии начинаются с символа # (кроме первой строки).
3. В bash переменные не имеют типа(о них речь пойдет ниже)
Переменные и параметры скрипта
Приведу как пример небольшой пример, который мы разберем:
#!/bin/bash
#указываем где у нас хранится bash-интерпретатор
parametr1=$1 #присваиваем переменной parametr1 значение первого параметра скрипта
script_name=$0 #присваиваем переменной script_name значение имени скрипта
echo «Вы запустили скрипт с именем $script_name и параметром $parametr1» # команда echo выводит определенную строку, обращение к переменным осуществляется через $имя_переменной.
echo ‘Вы запустили скрипт с именем $script_name и параметром $parametr1’ # здесь мы видим другие кавычки, разница в том, что в одинарных кавычках не происходит подстановки переменных.
exit 0 #Выход с кодом 0 (удачное завершение работы скрипта)
Результат выполнения скрипта:
$ ./test.sh qwerty
Вы запустили скрипт с именем ./test.sh и параметром qwerty
Вы запустили скрипт с именем $script_name и параметром $parametr1
После того как мы познакомились как использовать переменные и передавать скрипту параметры, время познакомиться с зарезервированными переменными:
$DIRSTACK — содержимое вершины стека каталогов
$EDITOR — текстовый редактор по умолчанию
$EUID — Эффективный UID. Если вы использовали программу su для выполнения команд от другого пользователя, то эта переменная содержит UID этого пользователя, в то время как.
$UID — . содержит реальный идентификатор, который устанавливается только при логине.
$FUNCNAME — имя текущей функции в скрипте.
$GROUPS — массив групп к которым принадлежит текущий пользователь
$HOME — домашний каталог пользователя
$HOSTNAME — ваш hostname
$HOSTTYPE — архитектура машины.
$LC_CTYPE — внутренняя переменная, котороя определяет кодировку символов
$OLDPWD — прежний рабочий каталог
$OSTYPE — тип ОС
$PATH — путь поиска программ
$PPID — идентификатор родительского процесса
$SECONDS — время работы скрипта(в сек.)
$# — общее количество параметров переданных скрипту
$* — все аргументы переданыне скрипту(выводятся в строку)
$@ — тоже самое, что и предыдущий, но параметры выводятся в столбик
$! — PID последнего запущенного в фоне процесса
$$ — PID самого скрипта
Условия
Условные операторы, думаю, знакомы практически каждому, кто хоть раз пытался на чем-то писать программы. В bash условия пишутся след. образом (как обычно на примере):
#!/bin/bash
source=$1 #в переменную source засовываем первый параметр скрипта
dest=$2 #в переменную dest засовываем второй параметр скрипта
if [[ «$source» -eq «$dest» ]] # в ковычках указываем имена переменных для сравнения. -eq — логическое сравнение обозначающие «равны»
then # если они действительно равны, то
echo «Применик $dest и источник $source один и тот же файл!» #выводим сообщение об ошибке, т.к. $source и $dest у нас равны
exit 1 # выходим с ошибкой (1 — код ошибки)
else # если же они не равны
cp $source $dest # то выполняем команду cp: копируем источник в приемник
echo «Удачное копирование!»
fi #обозначаем окончание условия.
Результат выполнения скрипта:
ite@ite-desktop:
$ ./primer2.sh 1 1
Применик 1 и источник 1 один и тот же файл!
ite@ite-desktop:
$ ./primer2.sh 1 2
Удачное копирование!
Структура if-then-else используется следующим образом:
if
then
else
В качестве команд возвращающих код возврата могут выступать структуры [[ , [ , test, (( )) или любая другая(или несколько) linux-команда.
test — используется для логического сравнения. после выражения, неоьбходима закрывающая скобка «]»
[ — синоним команды test
[[ — расширенная версия «[» (начиная с версии 2.02)(как в примере), внутри которой могут быть использованы || (или), & (и). Долна иметь закрывающуб скобку «]]»
(( )) — математическое сравнение.
для построения многоярусных условий вида:
if .
then .
else
if .
then.
else .
для краткости и читаемости кода, можно использовать структуру:
if ..
then .
elif .
then .
elif .
Условия. Множественный выбор
Если необходимо сравнивать какоую-то одну переменную с большим количеством параметров, то целесообразней использовать оператор case.
#!/bin/bash
echo «Выберите редатор для запуска:»
echo «1 Запуск программы nano»
echo «2 Запуск программы vi»
echo «3 Запуск программы emacs»
echo «4 Выход»
read doing #здесь мы читаем в переменную $doing со стандартного ввода
case $doing in
1)
/usr/bin/nano # если $doing содержит 1, то запустить nano
;;
2)
/usr/bin/vi # если $doing содержит 2, то запустить vi
;;
3)
/usr/bin/emacs # если $doing содержит 3, то запустить emacs
;;
4)
exit 0
;;
*) #если введено с клавиатуры то, что в case не описывается, выполнять следующее:
echo «Введено неправильное действие»
esac #окончание оператора case.
Результат работы:
ite@ite-desktop:
$ ./menu2.sh
Выберите редатор для запуска:
1 Запуск программы nano
2 Запуск программы vi
3 Запуск программы emacs
4 Выход
После выбор цифры и нажатия Enter запуститься тот редактор, который вы выбрали(если конечно все пути указаны правильно, и у вас установлены эти редакторы 🙂 )
Прведу список логических операторв, которые используются для конструкции if-then-else-fi:
-z # строка пуста
-n # строка не пуста
=, (==) # строки равны
!= # строки неравны
-eq # равно
-ne # неравно
-lt,( ) #больше
-ge,(>=) #больше или равно
! #отрицание логического выражения
-a,(&&) #логическое «И»
-o,(||) # логическое «ИЛИ»
С основами языка и условиями мы разобрались, чтобы не перегружать статью, разобью её на несколько частей(допустим на 3). Во второй части разберем операторы цикла и выполнение математических операций.
UPD: Исправил некоторые ошибки
UPD: Обновил часть про условия if-then-else
Источник
Разбираемся с аргументами в 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
Источник