Эмуляция до-до bash не работает - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь сделать эмуляцию до-в bash, но не работает. код ниже

# an emulation of the do-until loop

do_stuff() {

echo "Enter password"
read password         

if [[ $password != "theflow" ]]
   then
     echo " Sorry, try again."
fi   
}

do_stuff

until (( $password == "theflow" ))
 do
  do_stuff
done

1 Ответ

2 голосов
/ 28 февраля 2020

Вместо того, чтобы сравнивать $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 , Вы должны использовать [[ для сравнения строк.

...