在以下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
答案 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