【发布时间】:2017-05-17 17:20:07
【问题描述】:
我有个密码功能是从How do I echo stars (*) when reading password with read?借来的
我尝试对其进行调整,以便我可以运行两次该函数以进行密码确认,然后评估 2 个密码以确定它们是否匹配,但我似乎缺少一些关于 bash 在这种情况下如何工作的基础知识。
我尝试用$1 替换PASSWORD,但不断收到command not found 错误
passWord() {
unset PASSWORD
unset CHARCOUNT
stty -echo
CHARCOUNT=0
while IFS= read -p "$PROMPT" -r -s -n 1 CHAR; do
# Enter - accept password
if [[ $CHAR == $'\0' ]] ; then
break
fi
# Backspace
if [[ $CHAR == $'\177' ]] ; then
if [ $CHARCOUNT -gt 0 ] ; then
CHARCOUNT=$((CHARCOUNT-1))
PROMPT=$'\b \b'
PASSWORD="${PASSWORD%?}"
else
PROMPT=''
fi
else
CHARCOUNT=$((CHARCOUNT+1))
PROMPT='*'
PASSWORD+="$CHAR"
fi
done
stty echo; echo
${1}=${PASSWORD}
}
echo -n "Enter the password > "
passWord passOne
echo -n "Please re-enter the password > "
passWord passTwo
if [[ $passOne == $passTwo ]]; then
PASSWORD=$passOne
else
echo "Passwords did not match, please try again."
fi
更新 这是最新更新的脚本
#!/bin/bash
passWord() {
unset password
local prompt char
stty -echo
charcount=0
while IFS= read -p "$prompt" -r -s -n 1 CHAR; do
# Enter - accept password
if [[ $char == $'\0' ]] ; then
break
fi
# Backspace
if [[ $char == $'\177' ]] ; then
if [ $charcount -gt 0 ] ; then
charcount=$((CHARCOUNT-1))
prompt=$'\b \b'
password="${password%?}"
else
prompt=''
fi
else
charcount=$((charcount+1))
prompt='*'
password+="$char"
fi
done
stty echo; echo
}
echo -n "Enter the password > "
passWord
pass1=$password
echo -n "Please re-enter the password > "
passWord
pass2=$password
if [[ "$pass1" == "$pass2" ]]; then
PassWord=$pass1
else
echo "Passwords did not match, please try again."
fi
【问题讨论】:
-
Shellcheck.net 告诉您有关您的代码的哪些信息?
-
@David 关于通配符和分词的一些警告,但不能解决我的问题。你在暗示什么?
-
问题是
${1}=${PASSWORD}没有将${PASSWORD}分配给passOne或passTwo。 (如果没有eval,你不能以这种方式进行变量赋值——不推荐)替换为echo ${PASSWORD},然后在外面做类似passOne=$(passWord)的事情,passTwo也是如此。关键是 shellcheck 告诉你passOne和passTwo是 Referenced but Unassigned -
@DavidC.Rankin 知道了,谢谢。
-
您还应该在函数顶部使用
local PROMPT(或unset PROMPT),以防止在第二个密码提示的开头回显*。