2012-06-08 3 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 

난은 File2.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 

을 그리고은 File2.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를 호출하고 get_it() {$ 1 = foosomething echo "$ {! 1}"} – jared

+0

@jared와 같은 일을 함으로서 함수 foo = somethingelse를 설정하십시오 :'declare'를 사용할 수 있습니다. . 당신은'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

관련 문제