【问题标题】:Read input, save it to a dynamically-named variable and check if given input was empty读取输入,将其保存到动态命名的变量中并检查给定的输入是否为空
【发布时间】:2013-05-27 19:00:48
【问题描述】:

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

【问题讨论】:

标签: bash variables dynamic zsh


【解决方案1】:

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

【讨论】:

  • 感谢您的意见。这让它变得不那么混乱了!
  • zsh 中,语法为foo=bar; bar=3; print ${(P)foo}eval 应该只是完全兼容 POSIX 所必需的。
【解决方案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"

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-25
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 1970-01-01
      • 2014-12-03
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多