read value validation

1

Existe uma maneira de validar ou confirmar que o usuário escreveu o que significa escrever em read ?

  • Por exemplo, o usuário quis escrever "Hello world!" mas erroneamente escreveu "Hello world @".

  • Isso é muito semelhante à validação de formulário de contato de um campo de e-mail / telefone.

Existe uma maneira de solicitar ao usuário algo como "Por favor, digite novamente a entrada", em leitura?

Não encontrei essa opção em man read .

Observação: a entrada é uma senha, portanto, não quero imprimir ou comparar com uma string já existente.

    
por Arcticooling 13.01.2018 / 10:07

2 respostas

4

Com o shell bash , você sempre pode fazer

FOO=a
BAR=b
prompt="Please enter value twice for validation"
while [[ "$FOO" != "$BAR" ]]; do
    echo -e $prompt
    read -s -p "Enter value: " FOO
    read -s -p "Retype to validate: " BAR
    prompt="\nUups, please try again"
done
unset -v BAR
# do whatever you need to do with FOO
unset -v FOO

read opções usadas:

  • -s modo silencioso. Se a entrada vem de um terminal, os caracteres não são ecoados.
  • -p prompt Exibe o prompt no erro padrão, sem uma nova linha, antes de tentar ler qualquer entrada.
por 13.01.2018 / 10:24
3

Você pode definir uma função para isso.

com zsh ou bash :

blind_read_and_confirm() {
  # args: <prompt> <variable-name>
  local _confirm_
  until
    printf >&2 %s "$1"
    IFS= read -rs "${2-REPLY}" || return
    printf >&2 "\n%*s" "${#1}" 'and again: '
    IFS= read -rs _confirm_ || return
    eval '[ "${'"${2-REPLY}"'}" = "$_confirm_" ]'
  do
    printf >&2 "\nEntries differ, please try again.\n"
  done
  printf '\n'
}

Para ser usado, por exemplo, como

blind_read_and_confirm "Please choose a password: " password || exit

printf 'You entered a %s character password.\n' "${#password}"

Observe que, sem o IFS= e -r , se o usuário inseriu " \/ery secret " , "/ery secret" seria armazenado em $password .

    
por 13.01.2018 / 19:18