在替代值扩展中使用字符串作为bash变量名称

时间:2015-02-04 04:48:44

标签: bash variable-expansion variable-subsitution

如何在bash的替代值扩展(${var+alt})中使用一个变量的值作为另一个变量的名称?

我会认为

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

我想部分问题是执行命令替换的子shell不再知道$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

1 个答案:

答案 0 :(得分:-1)

我不确定我是否理解你的问题。

如果我得到了,你需要的是eval命令。

$ cat='dog'

$ varname='cat'

$ echo ${varname}

cat

$ eval echo \$${varname}

dog