我试图给用户三次机会输入正确的日期格式,即 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
我发现上述脚本有两个问题:
您匹配字符串的正则表达式可以更具体一些。实际上这不是问题,但您知道您不能依赖用户,因此您应该正确验证该日期。请注意,您也不需要括号。因此更好的方法可能是:
^[0-9][0-9]/[0-9][0-9]/[0-9][0-9]$
即使用户输入了有效日期,您仍会继续循环。如果用户输入成功,则应退出循环。我还没有尝试过,但应该可以:
#!/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