Передача одной переменной сценария оболочки в другой сценарий оболочки - PullRequest
3 голосов
/ 21 июля 2011

Я пытаюсь получить доступ к одной переменной скрипта из другого скрипта, например,

script1.sh:

export a=10
export b=20
echo "testing"
exit

script2.sh:

. script1.sh
echo $a

Проблема, связанная с этим, заключается в том, что она может получить доступ к переменной 'a' из script1 в script2 , но при этом выполняет все команды , записанные в script1.sh , что раздражает. Я просто хочу получить доступ только к экспортированным переменным в script1 и не хочу запускать команды в script1 при вызове этого в script2 .

Пожалуйста, помогите!

Спасибо
Картик

Ответы [ 7 ]

2 голосов
/ 21 июля 2011

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

Обходной путь:

Извлечение объявления и инициализации переменнойв третий файл, который затем получен обоими.

common-vars:

export a=10
export b=20

script1.sh:

. common-vars
echo "testing"
exit

script2.sh:

. common-vars
echo $a
2 голосов
/ 21 июля 2011

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

1 голос
/ 21 июля 2011

Если ваши переменные присвоены только когда-либо в указанной выше точной форме, то есть

export a=10

тогда вы можете извлечь эти назначения с grep и eval результатами. Ваш script2.sh будет тогда

eval `grep "^export " script1.sh`
echo $a

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

Это может сломаться, если у вас есть настройки переменных внутри условных выражений, или если ваши экспортированные переменные зависят от других неэкспортированных переменных, которые были пропущены, или если вы устанавливаете и экспортируете переменные отдельно; и если вы используете подстановку команд в своих экспортах, они все равно будут запускаться с их возможными побочными эффектами.

if [ $doexport = 1 ]; then
  export a=1
fi

a=2
export a

b=2
export a=$b

export a=`ls |wc -l`

Все это потенциально проблематично.

0 голосов
/ 23 августа 2013

Вы можете передать переменную из одного скрипта в другой, передав переменную в качестве параметра.Это, конечно, означает, что скрипт B будет вызываться скриптом A. Скрипт B должен будет проверить, что переданный параметр не пустой.

0 голосов
/ 12 апреля 2013

Я согласен с «Игнасио Васкесом-Абрамсом», это хороший ответ на ваш вопрос.

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

Допустим, ваш скрипт1.sh:

a=10 

b=20

теперь запускайте сценарий при входе в системуshell:

Пример:

.[space]script1

Теперь, если вы получите доступ к переменной a в вашем скрипте, она будет доступна вам в обязательном порядке.

Пример

Допустим, ваш script2.sh:

echo $a

run:

.[space]script2
0 голосов
/ 21 июля 2011

script2.sh:

eval "$(grep export script1.sh)"
echo $a
0 голосов
/ 21 июля 2011

Я согласен с Игнасио Васкесом-Абрамсом.

Назначение переменной - это команда

Не так много, что вы можете с этим поделать.

Вероятное решение - разделить определения переменных на третий сценарий, который будет использоваться как сценарий configuration . Таким образом, оба script1 и script2 будут source, чтобы использовать переменные, определенные там.

...