1

Я пытаюсь дать пользователю 3 шанса набрать в правильном формате даты, который мм / дд / гг.

Если все 3 раза он вводит неправильный формат даты, в коде будет отображаться "Неверная дата", и если один из трех шансов он вводит в правильном формате, должно отображаться сообщение "Правильная дата".

Но каждый раз, когда я запускаю приведенный ниже код, он не дает желаемого результата. Пожалуйста, дайте мне знать, что я делаю не так?

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

2 ответа2

0

похоже, это работает (хотя это может быть еще немного убрано), ошибка, которую вы имели, заключалась в том, что она всегда была зациклена, даже если он вводил дату в правильном формате:

#!/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"; }
0

Я вижу две проблемы со сценарием выше:

  1. Регулярное выражение, с которым вы сопоставляете строку, может быть более конкретным. На самом деле это не проблема, но вы знаете, что не можете полагаться на пользователя, поэтому вам следует правильно проверить эту дату. Обратите внимание, что вам не нужны скобки. Так что лучше может быть:

    ^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$
    
  2. Вы продолжаете цикл, даже если пользователь ввел правильную дату. Вы должны выйти из цикла, если пользователь преуспел. Я не пробовал это, но это должно работать:

    #!/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
    

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .