используя AWK
Для поиска переменной перед разделителем:
Выход
Для поиска переменной после разделителя:
Выход
Подводя итог, вы хотите получить значение из script1.sh
, не выполняя все команды в script1.sh
. Я предполагаю, что script1.sh
не находится под вашим контролем, возможно, потому что он предоставляется поставщиком, или управляется упрямым коллегой, или подобная проблема, из-за которой script1.sh
следует использовать как есть.
Я представлю два подхода. Первый подходит для получения определенных переменных из script1.sh
, по одной:
var=$(awk -F'"' '/^variable=/ {print $2}' script1.sh )
echo $var
Здесь используется awk
для чтения (не выполнения, просто чтения) script1. sh
. awk
ищет строку, которая начинается с variable =
, а затем записывает то, что появляется после двойных кавычек в этой строке. Вывод awk
записывается в переменную var
.
Более подробно:
Выражение имеет вид var = $ (...)
. Это означает, что все, что указано в круглых скобках, запускается как команда bash, и ее стандартный вывод назначается переменной var
.
В круглых скобках у нас есть команда awk
: awk -F '"' '/ ^ variable = / {print $ 2}' script1.sh
. Давайте рассмотрим это по частям.
awk
разбивает строки (записи) на поля. -F '"'
указывает awk использовать двойные кавычки в качестве разделителя полей.
/ ^ variable = /
сообщает awk
ограничить работу строками, которые начинаются с variable =
. Таким образом, все разные команды в script1.sh
будут проигнорированы.
{print $ 2}
указывает awk
напечатать второе поле. Это означает все, что находится между первым и вторым появлением символа двойной кавычки.
Последний аргумент awk
сообщает ему, какой файл читать: script1.sh
.
Вышеупомянутый подход хорош для обработки одной переменной за раз и позволяет вам переименовать переменную, если хотите.
Если вы хотите получить все переменные, назначенные в script1.sh
, подумайте:
source <(grep -E '^\w+=' script1.sh)
Здесь используется grep
для извлечения всех строк из script1.sh
, которые выглядят как присвоения переменных. Затем эти строки запускаются в текущей оболочке, присваивая переменные.
Если вы используете этот подход, сначала убедитесь, что вам нужны все переменные и что нет ни одной, которая будет мешать тому, что вы делаете. Если они есть, мы можем исключить их с помощью второй команды grep
.
Рассмотрение частей по очереди:
исходный файл
сообщает оболочке выполнить файл
в текущей оболочке.
<(...)
называется подстановкой процесса. Это позволяет нам использовать вывод команды вместо имени файла.
Команда grep -E '^ \ w + =' script1.sh
извлекает все строки, которые выглядят как присвоения переменных. Если вы запустите эту команду отдельно в командной строке, вы должны увидеть что-то вроде:
variable = "Hello"
var2 = "Значение2"
и так далее. Сначала вы должны сделать это и проверить вывод, чтобы убедиться, что это те строки, которые вы хотите выполнить.
Вы должны сделать это с помощью трех скриптов:
cat ./script/init_vars.sh
variable_1=value_1
variable_2=value_2
variable_3=value_3
cat ./script/module_1.sh
. ./script/init_vars.sh
printf %s\\n "$variable_1"
cat ./script/module_2.sh
. ./script/init_vars.sh
printf %s\\n "$variable_1"
Если бы ваши файлы выглядели как ^ that ^ , вы могли бы сделать это намного проще - не полагаясь на регулярные выражения. Запуск либо module_1.sh
, либо module_2.sh
приведет к выводу:
value_1
Используйте source
для чтения файловой переменной в другом файле оболочки.
Предположим, что ваша переменная var1
инициализирована в/pathtoFile1/file1.sh
var1='Sridhar'
В другом сценарииfile2.sh
:
source /pathtoFile1/file1.sh
var2=$var1
Теперь var2
содержит var1
значение