2012-06-08 2 views
2

Есть ли способ в bash, чтобы понять имя переменной, которая ему передана?Имя переменной, переданной функции в bash

Пример:

var1=file1.txt 
err_var=errorfile.txt 

function func1 { 
    echo "func1: name of the variable is: " $1 
    echo "func1: value of variable is: " $1 
    echo 
    if [ ! -e $var1 ] 
    then 
     $1 = $err_val #is this even possible? 
    fi 
    func2 $1 
} 

function func2 { 
    echo "func2: name of the variable is: " $1 
    echo "func2: value of variable is: " $1 
    echo 
} 

func1 $var1 
func1 $err_var 

Я надеялся получить следующий результат, если file1.txt существует:

func1: name of the variable is: var1 
func1: value of variable is: file1.txt 

func2: name of the variable is: var1 
func2: value of variable is: file1.txt 

И когда file1.txt не существует:

func1: name of the variable is: var1 
func1: value of variable is: file1.txt 

func2: name of the variable is: err_var 
func2: value of variable is: errorfile.txt 

Есть идеи?

+0

Что делать, если вы сделали 'FUNC1 "Foo"'? –

+0

'-e' тесты для существования файла, а не переменное существование (или (не) пустота). –

ответ

9

Нет, переменная расширяется до того, как функция увидит ее. Функция видит только значение, а не имя переменной.

Если вы передадите имя переменной без изменений и без знака доллара, вы можете использовать косвенное обозначение.

get_it() { 
    echo "${!1}" 
} 

Демо:

$ foo=bar 
$ baz=qux 
$ get_it foo 
bar 
$ get_it baz 
qux 
+0

Спасибо Деннис. Можно ли установить переменную в функцию без статического определения переменной? т.е. вызвать get_it foo и установить функцию foo = somethingelse, выполнив что-то вроде get_it() {$ 1 = foosomething echo "$ {! 1}"} – jared

+0

@jared: вы можете использовать 'declare', но это автоматически делает переменную local , Вы можете использовать 'export', но это явно экспортирует переменную в любые дочерние процессы (что * может * нежелательно). 'set_it() {export" $ 1 "=" something_else "; }; бар = one_thing; set_it bar; get_it bar' –

+0

Вы также можете использовать 'eval'. См. Https://stackoverflow.com/questions/9714902/how-to-use-a-variables-value-as-other-variables-name-in-bash – Fabio

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