2015-02-04 2 views
0

Как использовать значение одной переменной в качестве имени другой переменной в альтернативном расширении значения (${var+alt}) в bash?Использовать строку как имя переменной bash в альтернативном расширении значения

Я думаю, что

#!/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 

, но когда я пытаюсь сделать это, я получаю

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

Я думаю часть проблемы заключается в том, что подоболочка, выполняющая подстановку команд, уже не знает о $varname? Мне нужно экспортировать эту переменную?

Моя причина этого в том, что я узнал от this answer как проверить, если переменная равна нулю, и я стараюсь, чтобы инкапсулировать эту проверку в функции под названием is_null, как это:

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}]; затем ... ' –

ответ

-1

I Я не знаю, понимаю ли я вашу проблему.

Если у меня есть, то вам нужна команда eval.

$ cat='dog' 

$ varname='cat' 

$ echo ${varname} 

cat 

$ eval echo \$${varname} 

dog 
+0

То, что он искал, было ** косвенным **, в то время как это может быть выполнено с помощью' eval', использование 'eval' в этих обстоятельствах неодобрительно. –

+0

@Davison Я ценю ваш ответ - 'eval' может выполнить эту работу, но, как сказал Дэвид, я пытался избежать использования этого кувалды в пользу более точного инструмента. Я забыл отметить свой вопрос как дубликат ссылки, указанной выше. –