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

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



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

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

root@server:~# ./myscript.sh parameter $number 'просто строка' 12

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

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

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

  • в переменную $0 попадает имя вызываемого скрипта
  • в переменную $1 попадает первый параметр
  • в переменную $2 попадает второй параметр
  • ... и так далее, до
  • в переменную $9 попадает девятый параметр

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

#!/bin/bash
echo 'Имя скрипта: ' $0
echo '1-й параметр: ' $1
echo '2-й параметр: ' $2
echo '3-й параметр: ' $3
echo '4-й параметр: ' $4

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

root@server:~# ./myscript.sh parameter $number 'просто строка' 12
Имя скрипта:  ./myscript.sh
1-й параметр:  parameter
2-й параметр:  просто строка
3-й параметр:  12
4-й параметр:

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

root@server:~# read number
Поместим_значение_в_переменную_number

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

root@server:~# ./myscript.sh parameter $number 'просто строка' 12
Имя скрипта:  ./myscript.sh
1-й параметр:  parameter
2-й параметр:  Поместим_значение_в_переменную_number
3-й параметр:  просто строка
4-й параметр:  12

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

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

root@server:~# read number
Поместим значение в переменную $number

 

root@server:~# ./myscript.sh parameter "$number" 'просто строка' 12
Имя скрипта:  ./myscript.sh
1-й параметр:  parameter
2-й параметр:  Поместим значение в переменную $number
3-й параметр:  просто строка
4-й параметр:  12

Важное замечание:
Если BASH-скрипту надо больше девяти параметров, при обращении к ним номер в имени переменной надо заключать в фигурные скобки, например: ${12}

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

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

#!/bin/bash
if [ -n "$1" ]
	then
		echo 'Имя скрипта: ' $0
		echo '1-й параметр: ' $1
		echo '2-й параметр: ' $2
		echo '3-й параметр: ' $3
		echo '4-й параметр: ' $4
	else
		echo 'Нет данных на входе скрипта ' $0
fi

Теперь, если на входе скрипта есть хотя бы один параметр, будет выполняться блок then, если никаких параметров не передаётся, то выводятся данные из блока else. Всё логично:

root@server:~# ./myscript.sh
Нет данных на входе скрипта  ./myscript.sh

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

Иногда требуется точно знать, сколько параметров передано BASH-скрипту на вход. И для того, чтобы это узнать, есть простое решение. Количество параметров, передаваемых BASH-скрипту хранится в переменной $#. Ещё немного расширим нашу программу:

#!/bin/bash
echo 'Количество параметров на входе: ' $#
if [ -n "$1" ]
	then
		echo 'Имя скрипта: ' $0
		echo '1-й параметр: ' $1
		echo '2-й параметр: ' $2
		echo '3-й параметр: ' $3
		echo '4-й параметр: ' $4
	else
		echo 'Нет данных на входе скрипта ' $0
fi

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

root@server:~# ./myscript.sh parameter "$number" 'просто строка' 12
Количество параметров на входе:  4
Имя скрипта:  ./myscript.sh
1-й параметр:  parameter
2-й параметр:  Поместим значение в переменную $number
3-й параметр:  просто строка
4-й параметр:  12

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

И последний вопрос, который рассмотрим в этой статье, это как узнать значение последнего параметра, передаваемого BASH-скрипту сразу (без перебора, подсчёта и разбора). В этом вопросе нам выручит как раз переменная $#, указывающая порядковый номер последнего параметра. А зная номер параметра, можно сразу получить его значение в переменной ${!#}. На практике выглядит это так:

#!/bin/bash
echo 'Количество параметров на входе: ' $#
if [ -n "$1" ]
	then
		echo -e 'Последний параметр имеет значение: ' ${!#} '\n'
		echo 'Имя скрипта: ' $0
		echo '1-й параметр: ' $1
		echo '2-й параметр: ' $2
		echo '3-й параметр: ' $3
		echo '4-й параметр: ' $4
	else
		echo 'Нет данных на входе скрипта ' $0
fi

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

root@server:~# ./myscript.sh parameter "$number" 12 'Конец! =)'
Количество параметров на входе:  4
Последний параметр имеет значение:  Конец! =)

Имя скрипта:  ./myscript.sh
1-й параметр:  parameter
2-й параметр:  Поместим значение в переменную $number
3-й параметр:  12
4-й параметр:  Конец! =)

Резюме

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

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

Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! ;)

Старт! Горячий старт на просторы интернета
Старт! Горячий старт на просторы интернета
Старт! Меню