Bash动态var名称分配和访问

时间:2017-12-02 12:20:54

标签: bash

在以下bash函数中,我希望在第一个PASS出现时创建一个名为$2的新变量,然后让新的$PASS变量进行测试在第二次$2发生。

function ask() {
    while read -s -p "Type your $1 and press enter: " $2 && [[ -z "${$2// }" ]]; do
        echoboldred -e "\n${1^} can't be blank."
    done
}

ask password PASS

2 个答案:

答案 0 :(得分:3)

问题是${$2// }。 要对名称位于//的变量执行$2, 正确的语法是${!2// }

while read -s -p "Type your $1 and press enter: " "$2" && [[ -z "${!2// }" ]]; do

答案 1 :(得分:1)

你也可以使用local -n声明的nameref而不是参数间接,它可能会使你的代码更具可读性:

ask() {
   local -n foo=$2
   while read -srp "Type your $1 and press enter: " foo && ! [[ $foo ]]; do
      printf -- "\n%s can't be blank.\n" "${1^}"
   done
}

ask password pass

不要使用function关键字声明您的功能,并建议-r选项与read一起使用你的密码里面有反斜杠:

-r      do not allow backslashes to escape any characters