Как я получаю значение переменной из одного сценария и импортирую его в другом сценарии?

используя AWK

Для поиска переменной перед разделителем:

Выход

Для поиска переменной после разделителя:

Выход

1
09.06.2014, 05:27
3 ответа

Подводя итог, вы хотите получить значение из 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"
     

    и так далее. Сначала вы должны сделать это и проверить вывод, чтобы убедиться, что это те строки, которые вы хотите выполнить.

4
27.01.2020, 23:13

Вы должны сделать это с помощью трех скриптов:

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
4
27.01.2020, 23:13

Используйте sourceдля чтения файловой переменной в другом файле оболочки.

Предположим, что ваша переменная var1инициализирована в/pathtoFile1/file1.sh

var1='Sridhar'

В другом сценарииfile2.sh:

source /pathtoFile1/file1.sh
var2=$var1

Теперь var2содержит var1значение

-1
27.01.2020, 23:13

Теги

Похожие вопросы