2015-02-04 3 views
0

bash에서 대체 값 확장 (${var+alt})의 다른 변수 이름으로 한 변수의 값을 사용하는 방법은 무엇입니까?대체 값 확장에서 bash 변수 이름으로 문자열 사용

나는 문제의 일부를 추측

${`echo "${cat}"`+x}: bad substitution 

내가

#!/bin/bash 
cat='dog' 
varname='cat' 
if [ -z ${`echo "${varname}"`+x} ]; then 
    echo 'is null' 
fi 

#!/bin/bash 
if [ -z ${dog+x} ]; then 
    echo 'is null' 
fi 

거의 비슷해야한다고 생각하지만이 작업을 수행 할 때, 내가 할 명령 대체를 수행하는 서브 쉘이 더 이상 $varname을 알지 못한다는 것입니까? 해당 변수를 내 보내야합니까?

이 일에 대한 나의 이유는 내가 변수가 null인지 확인하고, 나는이 같은 is_null라는 함수에서 그 수표를 캡슐화하기 위해 노력하고있어 방법 this answer에서 배운 것입니다 :

function is_null { 
    if [ $# != 1 ]; then 
     echo "Error: is_null takes one argument" 
     exit 
    fi 
    # note: ${1+x} will be null if $1 is null, but "x" if $1 is not null 
    if [ -z ${`echo "${1}"`+x} ]; then 
     return 0 
    else 
     return 1 
    fi 
} 

if is_null 'some_flag'; then 
    echo 'Missing some_flag' 
    echo $usage 
    exit 
fi 
+2

난 당신이 필요하다고 생각이 http://stackoverflow.com/questions/26337826/in-linux-shell-script-how-can-i-recall-value-of-variable/26337979#26337979 –

+0

@ Ashwani 감사합니다, 그건 내가 필요한 것입니다. if 문을 if [-z $ {! 1 + x}]로 변경했습니다. then ... ... ' –

답변

-1

I 네 문제를 이해하는지 모르겠다.

내가 갖고 있다면, 당신이 필요로하는 것은 eval 명령입니다.

$ cat='dog' 

$ varname='cat' 

$ echo ${varname} 

cat 

$ eval echo \$${varname} 

dog 
+0

그가 찾고 있던 것은 ** 간접적 인 **이었고, 그것은'eval'로 완성 될 수있는 반면,'eval'의 사용은 그러한 상황에서 눈살을 찌푸리게됩니다. –

+0

@Davison 답을 고맙게 생각합니다. 'eval'이 그 일을 할 수는 있지만, David이 말했듯이, 나는 더 큰 도구를 선호하여 그 망치를 사용하는 것을 피하려고했습니다. 내 질문을 위의 링크에 중복 된 것으로 표시하는 것을 잊었습니다. –