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