我的日期格式是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但这不会检查我输入的日期与实际日期的比较。
向文斯致以最良好的问候
发布于 2013-01-04 17:10:12
编辑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)使用引导方法可以让你确认输入的格式和的可靠性
更强的方法
如果你想检查输入,有一个更好的方法:
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之间是任意限制的,但这很容易理解/更改。
发布于 2013-01-04 17:46:40
您可以使用内联AWK脚本:
#!/bin/bash
read -p "Date (format yy-mm-dd-HH-MM-SS): " input
echo $input | awk -F"[-:]" '{
if( NF == 6 && $1 >= 0 && $2 >= 1 && $2 <= 12 && $3 >= 1 && $3 <= 31 && $4 >= 1 && $4 <= 24 && $5 >= 1 && $5 <= 60 && $6 >= 1 && $6 <= 60 ){
print "Ok!\n";
} else {
print "False!\n";
}
}'发布于 2013-01-04 15:48:59
如下所示更改日期提示符:
read -p "Date (format yyyy-mm-dd): " input此外,将日期格式化为4位数字年份,以及从分钟开始的秒数
check=$(date +"%Y-%m-%d %H:%M:%S")https://stackoverflow.com/questions/14152759
复制相似问题