Không thể xác thực định dạng ngày trong tập lệnh shell


1

Tôi đang cố gắng cung cấp cho người dùng 3 cơ hội để nhập đúng định dạng ngày là mm / dd / yy.

Nếu cả 3 lần anh ta đặt sai định dạng ngày, mã sẽ hiển thị "Ngày không hợp lệ" và nếu một trong số 3 cơ hội anh ta nhập đúng định dạng, thông báo "Ngày chính xác" sẽ được hiển thị.

Nhưng mỗi khi tôi chạy đoạn mã dưới đây thì nó không cho đầu ra mong muốn. Xin vui lòng cho tôi biết những gì tôi đang làm sai ??

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

Câu trả lời:


0

điều này dường như hoạt động (mặc dù nó có thể được giải quyết thêm), lỗi bạn gặp phải là nó luôn bị lặp ngay cả khi anh ta nhập ngày theo đúng định dạng:

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

Tôi thấy hai vấn đề với kịch bản trên:

  1. Regex bạn phù hợp với chuỗi có thể cụ thể hơn một chút. Đây thực sự không phải là một vấn đề, nhưng bạn biết rằng bạn không thể dựa vào người dùng để bạn xác nhận ngày đó một cách chính xác. Lưu ý rằng bạn cũng không cần dấu ngoặc đơn. Vì vậy, một cái tốt hơn có thể là:

    ^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$
    
  2. Bạn tiếp tục trên vòng lặp ngay cả khi người dùng đã nhập một ngày hợp lệ. Bạn nên thoát khỏi vòng lặp nếu người dùng đã thành công. Tôi đã không thử điều này nhưng nó sẽ hoạt động:

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

cảm ơn, bạn có thể xin giải thích chút hơn những gì hiện '^' và $ có nghĩa là trong ví dụ ở trên
user3337264

Biểu ^tượng cho sự cầu xin của một chuỗi, trong khi đó $là sự kết thúc của chuỗi trong thế giới regrec. Điều bạn đảm bảo theo cách này là người dùng sẽ không nhập 11/22/33a, chẳng hạn, vì điều đó sẽ khớp với chính xác trong lần thử đầu tiên của bạn. Tuy nhiên, nếu bạn phân định chuỗi, thậm chí vào trận chung kết a, nó sẽ không khớp.
nKn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.