Linux Bash – 日期格式
发布时间:2020-12-14 01:25:51 所属栏目:Linux 来源:网络整理
导读:我的日期格式是yyyy-mm-dd-hh:mm:ss 我该如何检查输入? 它应该是这样的: #!/bin/bashread -p "Date (format yy-mm-dd-HH-MM-SS): " inputcheck=$(date +"%Y-%m-%d-%H:%M:%S")if [ $input -eq $check ]; do echo "Right!"else echo "False!"fi 但这并没有
我的日期格式是yyyy-mm-dd-hh:mm:ss
我该如何检查输入? 它应该是这样的: #!/bin/bash read -p "Date (format yy-mm-dd-HH-MM-SS): " input check=$(date +"%Y-%m-%d-%H:%M:%S") if [ $input -eq $check ]; do echo "Right!" else echo "False!" fi 但这并没有检查日期它将我的输入与实际日期进行比较. 最好的祝福 解决方法
2016年4月编辑!
进一步了解(更强的方法) 原帖 尝试: #!/bin/bash read -p "Date (format yyyy-mm-dd): " input check=$(date +%F) if [ "$input" == "$check" ]; then echo "Right!" else echo "False!" fi 要么 #!/bin/bash read -p "Date (format YYYY-MN-DD-HH24:MM:SS): " input check=$(date +%F-%T) if [ "$input" == "$check" ]; then echo "Right!" else echo "False!" fi 测试良好: cat >hesdate.sh # Copy 1st sample and paste to terminal chmod +x hesdate.sh date +%F ; ./hesdate.sh 2013-01-04 Date (format yyyy-mm-dd): 2013-01-04 Right! cat >hesdate.sh # Copy 2nd sample and paste to terminal date -d now +10 sec +%F-%T ; ./hesdate.sh 2013-01-04-10:17:06 # copy this line Date (format YYYY-MN-DD-HH24:MM:SS): 2013-01-04-10:17:06 # past exactly 10 secs after Right! 编辑添加 要测试日期,您可以: [[ $input =~ ^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]$]] if [[ $input =~ ^2012-[0-9][0-9]-[0-9][0-9]-[0-9][0-9]:[0-9][0-9]:[0-9][0-9]$]];then 和/或 inputSecs=$(date -d "${input%-*} ${input##*-}" +%s) 使用boot方法可以确认输入的格式和可靠性 更强的方法 如果要检查输入,有一个更好的方法: unset adate declare -A adate date=2013-12-04-10:17:06 for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*} crt=${date##*${sep:-#}} ((min<=10#$crt&&10#$crt<=max)) && adate[$field]=$crt || echo Error: $crt not between $min and $max in $field field. date=${date%$sep*} done declare -p adate 这将转储adate数组变量: declare -A adate='([D]="04" [M]="12" [Y]="2013" [h]="10" [m]="17" [s]="06" )' 从那里,您可以重新验证日期编号: max=$(date -d "${adate[Y]}-${adate[M]}-1 +1 month -1 day" +%d) ((10#${adate[D]}>max)) && echo "Error Day number too high: (${adate[D]}>$max)." 唯一没有测试过的是场长 date=2012-02-29-10:17:06 会工作的 date=2012-2-29-10:17:06 也会工作(白天只有一个数字). 如果需要,您可以更改该行: for field in s:0-59 m:0-59 h-0-23 D-1-31 M-1-12 Y#2000-2100 ;do sep=${field:1:1} min=${field:2} field=${field:0:1} max=${min#*-} min=${min%-*} crt=${date##*${sep:-#}} 对于 for field in s:20-59 m:20-59 h-20-23 D-21-31 M-21-12 Y#42000-2100 ;do sep=${field:1:1} len=${field:2:1} min=${field:3} field=${field:0:1} max=${min#*-} min=${min%-*} crt=${date##*${sep:-#}} [ ${#crt} -eq $len ] || echo "Error: Field $field is no $len len: ${#crt}." 注意:年份字段在2000年到2100年之间被任意限制,但这很容易理解/改变. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |