2013-12-15 5 views
0

Если я хочу сохранить выходные данные из функции f Я могу сделать result=$(f), но это не сработает, если f изменяет глобальную переменную, так как f выполняется в подоболочке.Как вернуть значение из функции, которая изменяет глобальную переменную?

Ниже приведен пример, который иллюстрирует эту проблему:

x=0 

f() 
{ 
    x=1 
    echo "f" 
} 

result=$(f) 

В конце результат является «е», но х (все еще) 0. Есть ли способ вызова ф так что он имеет побочный эффект и, чтобы сохранить результат в переменной?

+0

установить вторую переменную – Kevin

+0

вы можете уточнить по делу и что не будет работать? – LiMar

+0

@LiMar ОК, я добавил пример. –

ответ

1

Ваши варианты:

1) Вызвать функцию НЕ в субоболочке и использовать return с некоторым кодом возврата

f() 
{ 
    x=1 
    return 15 
} 

x=0 
f 
r=$? 
echo "$r $x" 

будет приводить:

15 1 

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

2) МПК между оболочкой и подоболочка

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

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

f() 
{ 
    echo "1" > x.tmp 
    echo "f" 
} 

result=$(f) #"x" value is stored in x.tmp 

3) Возвращение как результат и побочный эффект вместе, как результат каскадного.

f() 
{ 
    x=1 
    echo "$x:f" 
} 

result_with_separator=$(f) 
+0

Стратегия номер два, кажется, подходит, никогда не думал об этом. Спасибо за подробный ответ LiMar. –

Смежные вопросы