Вместо того, чтобы сравнивать $password
в двух разных местах, я думаю, что было бы более разумно использовать код возврата вашей функции, чтобы указать, была ли проверка успешной или нет:
check_password () {
read -rsp 'Enter password: ' password
if [[ $password != 'theflow' ]]; then
echo 'Sorry, try again.' >&2
return 1
fi
return 0
}
Тогда ваш until
l oop может быть:
until check_password; do
:
done
, который будет продолжать звонить check_password
, пока не вернется 0
(успех).
Я внес еще пару изменений в Ваш код, основанный на предложениях в комментариях (спасибо!):
Я использовал read -rsp
, чтобы сделать следующее:
-r
отключить интерпретацию \
как escape-символ (вам почти всегда нужен этот) -s
тихий режим - не отображать символы -p 'Enter password: '
отображать подсказку, избегая необходимости echo
отдельно
Я также отправил сообщение об ошибке в stderr, используя >&2
.
Обратите внимание, что (( $password == "theflow" ))
не будет вести себя так, как вы ожидаете, потому что сравнение выполняется в контексте арифметического c , Вы должны использовать [[
для сравнения строк.