1

考虑一个通用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 下工作。

4

3 回答 3

3

在 bash 中,${!varname}为您提供名称为 的值的变量的值$varname,但据我所知,zsh 不支持这种语法。如果您想要在 bash 和 zsh 中都可以使用的东西,您可能必须使用 oldfashionedeval value=\${$varname}然后检查$value. 如果您事先知道 的值$varname是合法的变量名,您应该只使用它;否则这是不安全的。

于 2013-05-31T21:30:25.517 回答
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"
于 2013-05-31T21:35:54.897 回答
1

根据迄今为止的输入,我设法得到了一个令人满意的解决方案。

eval varname_tmp=\$$varname

if [ -z "$varname_tmp" ]; then
    eval "$varname=foo"
fi
于 2013-05-31T21:50:11.257 回答