Использование объявления внутри функции в Bash - PullRequest
1 голос
/ 22 сентября 2011

Я хочу изменить глобальную переменную (или хотя бы добавить к ней), используя функцию.

input="Hello"
example=input    

func() {
    declare -x $example="${input} World"
}

func
echo $input

Результатом этого будет "Hello" Исходное значение.Я хотел бы, чтобы функция смогла изменить исходное значение.Есть ли альтернатива для достижения этой цели?Обратите внимание, что мне нужно установить example=input, а затем выполнить операцию на примере (переменная).

Кстати, если я использовал eval, вместо этого функция будет жаловаться на то, что World - это функция или что-то в этом роде.

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Вы пробовали использовать экспорт?

export $example="${input} World"
1 голос
/ 18 января 2014

вы должны использовать

declare -x -g $example="${input} World"

в вашем func

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

см.

http://www.gnu.org/software/bash/manual/bashref.html

Также обратите внимание, что в MinGW declare не поддерживает -g опция.

0 голосов
/ 02 февраля 2013

Вы можете использовать eval, переопределив func () следующим образом:

func() {
    eval $example=\"${input} World\"
}

Это позволяет двойным кавычкам "выживать" при первом разборе (который расширяет переменные до их значений, какнеобходимо выполнить), чтобы eval снова начал анализ со строкой 'input = "Hello World".

Что касается использования export для выполнения работы, если переменная input на самом деле не нуждается вбыть экспортированным, включите его опцию '-n':

export -n $example=...

, и переменная останется переменной оболочки и не будет экспортирована как переменная окружения.

...