%20%D0%9F%D0%BE%D0%B6%D0%B0%D0%BB%D1%83%D0%B9%D1%81%D1%82%D0%B0%2C%20%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B8%D1%82%D0%B5!.png)
Что я сделал не так? Потому что когда я запускаю свой скрипт и останавливаю его после установки переменной, он сообщает, что у меня неверная переменная.
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 можно найти, например, по адресу