我想编写一个接受
的shell脚本来自用户并将验证日期和时间。
例如:
./test.sh mmddyyyy hhmmss 12122012 121212
应该返回正确的结果。
答案 0 :(得分:1)
如果您的日期有效,请使用此
date "+%d/%m/%Y" -d "03/10/2016" > /dev/null 2>&1
is_valid=$?
答案 1 :(得分:1)
您可以使用if
或case
语句以及expr
运算符来执行您尝试的操作,以解析和验证脚本的输入。关键是解析并将输入的date
和time
组件放入可由date --date=""
解释的格式中。您可以采取多种方法。以下是使用示例输入的最小示例:
#!/bin/sh
[ "$#" -lt "4" ] && {
printf "error: insufficient input.\n"
printf "usage: %s datestr timestr date time\n" "${0//*\//}"
printf " eg: %s mmddyyyy hhmmss 01012011 122515\n" "${0//*\//}"
exit 1
}
datestr=
timestr=
case "$1" in
"mmddyyyy" )
[ $(expr length "$3") -ne "8" ] && {
printf "error: invalid date for format.\n"
printf " '%s' != '%s'\n" "$1" "$3"
exit 1
}
datestr="$(expr substr "$3" 1 2)"
datestr="$datestr/$(expr substr "$3" 3 2)"
datestr="$datestr/$(expr substr "$3" 5 4)"
;;
* ) printf "error: invalid date format '%s'\n" "$1"
;;
esac
case "$2" in
"hhmmss" )
[ $(expr length "$4") -ne "6" ] && {
printf "error: invalid time for format.\n"
printf " '%s' != '%s'\n" "$2" "$4"
exit 1
}
timestr="$(expr substr "$4" 1 2)"
timestr="$timestr:$(expr substr "$4" 3 2)"
timestr="$timestr:$(expr substr "$4" 5 2)"
;;
* ) printf "error: invalid time format '%s'\n" "$2"
;;
esac
printf "%s\n" "$(date -d "$datestr $timestr")"
exit 0
示例使用/输出
$ sh datetmstr.sh mmddyyyy hhmmss 12122012 121212
Wed Dec 12 12:12:12 CST 2012
您可以在此方法的基础上添加其他日期/时间输入格式。 POSIX shell没有最大的字符串处理例程选择,但它对于这种类型的工作已经足够了。