我在这里做错了什么?因为当我运行脚本并在设置变量后停止它时,它说我有一个坏变量
qmail.script: 36: read: : bad variable name.
非常感谢您的帮助。
unset PASSWORD
unset CHARCOUNT
echo
echo -n "Please Enter a Password For VqAdmin, Roundcube and QmailAdmin.
Password: "
stty echo
CHARCOUNT=0
while IFS= read "$PROMPT" -p -r -s -n
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
答案1
我认为您没有展示全部代码,因此line 36
实际上显示的是read
您发布的代码片段中的语句。
这个read
说法是错误的。恕我直言,你的意思是
read -p "$PROMPT" -r -s -n1 CHAR
$PROMPT
是的参数-p
,在输入时打印“*”或不打印任何内容。-n
也需要一个参数,告诉一次读取多少个字符。- 该变量
$CHAR
稍后会被使用,但不会被赋值read
也只$PASSWORD
包含最后一个字符,因为你忘记连接了:PASSWORD=$CHAR
应该是
PASSWORD+=$CHAR
或者
PASSWORD=${PASSWORD}${CHAR}
经过这些修正,代码就可以按照我认为它应该的方式运行:显示“带星号”的密码提示。
根据此处的请求,提供完整且更正的代码片段
unset PASSWORD
unset CHARCOUNT
echo
echo -n "Please Enter a Password For VqAdmin, Roundcube and QmailAdmin.
Password: "
stty echo
CHARCOUNT=0
while IFS= read -p "$PROMPT" -r -s -n1 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
从你的评论来看,这段代码不是你自己写的(全部)(?),理解起来有些困难。我不会逐行向你解释它的作用。抱歉。我建议你在网上阅读,如果有问题的话再回来。关于read
它的选项的一个好的解释是给出。
有关 bash 编程的一般介绍可以在这里找到