Não é possível validar o formato de data no shell script

1

Estou tentando dar ao usuário três chances de digitar o formato de data correto, que é mm / dd / aa.

Se todas as 3 vezes que ele colocar um formato de data incorreto, o código exibirá "Data inválida" e, se uma das 3 chances entrar no formato correto, a mensagem "Data Correta" deverá ser exibida.

Mas toda vez que eu executo o código abaixo, ele não fornece a saída desejada. Por favor, deixe-me saber o que estou fazendo errado ??

a=0
while [ $a -lt 3 ]
do
    echo -n "enter the date :"
    read date
    [[ $date =~  ([0-9][0-9])/([0-9][0-9])/([0-9]) ]] || { printf "Invalid date\n"; }
    (( a++ )) 
done
    [[ "$date" = "([0-9][0-9])/([0-9][0-9])/([0-9])" ]] || { printf "correct date\n"; }

exit
    
por user3337264 09.09.2015 / 12:18

2 respostas

0

isso parece funcionar (embora possa ser mais arrumado), o erro que você teve foi que ele sempre ficava em loop mesmo se ele inserisse a data no formato correto:

#!/bin/bash
a=0
while [ $a -lt 3 ]
do
    echo -n "enter the date :"
    read date
    [[ $date =~  ([0-9][0-9])/([0-9][0-9])/([0-9]) ]] && break
    printf "Invalid date\n"; 
    (( a++ )) 
done
[[ $date =~ ([0-9][0-9])/([0-9][0-9])/([0-9]) ]] && { printf "correct date\n"; }
    
por 09.09.2015 / 12:28
0

Eu vejo dois problemas com o script acima:

  1. O regex que você está combinando com a string pode ser um pouco mais específico. Isso não é um problema, na verdade, mas você sabe que não pode confiar no usuário, portanto, você deve validar essa data corretamente. Note que você não precisa do parêntese também. Então, um melhor poderia ser:

    ^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$
    
  2. Você continua no loop mesmo que o usuário tenha inserido uma data válida. Você deve sair do loop se o usuário for bem-sucedido. Eu não tentei isso, mas deve funcionar:

    #!/bin/bash
    validdate=0
    a=0
    while [ $a -lt 3 ] && [ ! $validdate ]
    do
        echo -n "enter the date :"
        read date
        [[ $date =~ ^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$ ]] && validdate=1
        if [ ! $validdate ];
        then
            printf "Invalid date\n"; 
            (( a++ )) 
        fi
    done
    
    if [ ! $validdate ]
    then
       echo "3 wrong attempts"
    else
       echo "Date ok!"
    fi
    
por 09.09.2015 / 12:39