2012-01-16 5 views
5

У меня есть функция bash Unix, которая выполняет скрипт, который анализирует пользовательские переменные среды. Я хочу, чтобы не экспортировать соответствующие переменные в bash и вместо этого устанавливать их только для скрипта, как часть команды выполнения.Настройка переменных среды для скрипта в локальной переменной функции bash

Если я задаю переменные непосредственно в команде - например, VARNAME=VARVAL script_name - он работает хорошо. Однако, поскольку я хочу установить несколько переменных на основе разных условий, я хочу использовать локальную функциональную переменную для хранения параметров переменной среды, а затем использовать эту переменную в команде выполнения сценария. У меня есть локальная переменная «vars», которая в конечном счете установлена, например, на VARNAME=VAR, но если я попытаюсь запустить ${vars} script_name из моей функции bash, я получаю «команда не найдена» ошибка для назначения переменной $ vars - т.е. содержимое $ vars интерпретируется как команда, а не как назначение переменных среды.

Я пробовал различные варианты синтаксиса команды, но до сих пор безрезультатно. В настоящее время мне нужно экспортировать соответствующие переменные в функцию, прежде чем вызывать скрипт, а затем отключить/сбросить их до предыдущих значений, но на самом деле это не то решение, на которое я надеялся.

Любая помощь была бы принята с благодарностью.

Спасибо, Шарон

ответ

3

Чтобы оценить содержимое ваших переменных как выражение, а не как команды, вы можете попробовать использовать eval:

eval ${vars} script_Name 
+0

благодарим вас за быстрый ответ. Это сработало :-)! (Я действительно пытался использовать eval в какой-то момент, но я случайно использовал неправильный синтаксис.) – Sharon

+0

['eval' is evil] (http://mywiki.wooledge.org/BashFAQ/048) – l0b0

2

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

Вам не нужно хранить переменные в отдельной переменной. Вы можете назначить более одной переменной для команды:

$ cat test.sh 
#!/usr/bin/env bash 
echo "$foo" 
echo "$bar" 
$ foo=abc bar=def ./test.sh 
abc 
def 

Это также имеет преимущество в том, safer than eval.

+1

Я не уверен, как это помогает мне. Я заранее не знаю, какие значения переменных должны быть установлены для скрипта. Я определяю это во время выполнения, анализируя флаги, переданные функции bash. Вот почему я использую переменную - я обновляю локальную переменную с назначением переменных окружения на основе синтаксического анализа параметров функции, а затем я использую локальную переменную в вызове сценария. Опять же, использование «eval» для этого хорошо работает. Обратите внимание, что я не хочу устанавливать переменные среды в вызове функции bash, потому что я хочу использовать более простые флаги функций. – Sharon