无法验证 shell 脚本中的日期格式

无法验证 shell 脚本中的日期格式

我试图给用户三次机会输入正确的日期格式,即 mm/dd/yy。

如果他 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

答案1

这似乎有效(尽管还可以进一步整理),您遇到的错误是即使他以正确的格式输入日期,它也总是循环:

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

答案2

我发现上述脚本有两个问题:

  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
    

相关内容