读取输入,将其保存到动态命名的变量中,并检查给定的输入是否为空

时间:2013-05-31 21:10:45

标签: bash variables dynamic zsh

考虑一个通用ask()函数,它向用户询问一个问题,读取输入并将其保存在一个根据函数参数之一命名的变量中。

ask() {
    local question="$1"
    local varname="$2"

    echo "$question"
    read $varname
}

假设我想询问用户他最喜欢的宠物是什么,并将答案存储在名为$pet的变量中。用法如下:

ask "What is your favourite pet?" pet

我想要做的并且需要帮助的是检查用户的输入是否为空,并且在这种情况下将用户的输入设置为某个字符串。如果存储用户输入的变量的名称是常量,我将能够轻松地执行此操作,如下所示:

if [ -z "$pet" ]; then
    pet="foo"
fi

但是我要检查变量是否为空的变量的名称是我传入的第二个参数。如何检查包含用户输入的变量(按照$varname的值命名)是否为空?解决方案应该尽可能便携和标准,并且必须在bash和zsh下专门工作。

3 个答案:

答案 0 :(得分:3)

在bash中,${!varname}为您提供了名称为$varname值的变量的值,但据我所知,zsh不支持此语法。如果您想要在bash和zsh中都有效的内容,则可能必须使用旧式eval value=\${$varname},然后检查$value。如果您事先知道$varname的值是合法变量名称,则应该只使用此项;否则这是不安全的。

答案 1 :(得分:2)

也许:

ask() {
        name=$1;shift
        read -r -p "$@ >" var
        eval "$name='$var'"
}

ask pet "What is your favourite pet?"
pet=${pet:-foo}

echo "PET: $pet"

答案 2 :(得分:1)

根据目前的输入,我设法得到了令人满意的解决方案。

eval varname_tmp=\$$varname

if [ -z "$varname_tmp" ]; then
    eval "$varname=foo"
fi