我必须从bash脚本中读取文件,并始终在执行任何操作之前确认每行上的时间戳是否有效。我的时间戳看起来像这样:
Mar 15 14:20:48
我想检查我阅读的所有时间戳是否都具有正确的格式。我尝试通过以下方式进行操作:
(date -d ...)
但是,即使日期看起来像这样,这种趋向也会通过:Mar 15 14:2
有人告诉我要使用正则表达式来定义日期,所以我一直在使用它
if [["${LASTTS}" =~ ^[a-zA-Z]+ [0-3][0-9]+ [0-2][0-9]:[0-5][0-9]:[0-5][0-9]$ ]]; then
但是在说line 38: [[Mar 15 14:20:48: command not found
答案 0 :(得分:2)
我相信要求date
转换为期望的格式并检查输入日期格式和输出日期格式是否相同可能会更容易。如果它们相同,则输入日期字符串是有效字符串:
如果使用以下命令,它将把字符串转换为有效格式:
date -d "input-date" "+%b %d %T"
示例”
input-date (d1) | output-date (d2)| d1 == d2 | input valid
----------------+-----------------+----------+-------------
Mar 15 14:02:15 | Mar 15 14:02:15 | yes | yes
Mar 15 14:2 | Mar 15 14:02:00 | no | no
Mar 32 14:02:15 | | no | no
Mak 15 14:02:15 | | no | no
Mar 15 24:02:15 | | no | no
因此您的测试应如下所示:
d1="Mar 15 14:20:48"
d2=$(date -d "$d1" "+%b %d %T" 2> /dev/null)
if [[ "$d1" == "$d2" ]]; then
echo "the dates are the same"
fi
此方法比使用正则表达式安全一些,因为许多字符串可能会通过正则表达式,但不是有效日期。一个简单的示例就是“ XYZ 39 29:59:12”
如果有OP的问题,它将显示为:
if [[ "${LASTTS}" == $(date -d "${LASTTS}" "+%b %d %T" 2> /dev/null) ]]; then
答案 1 :(得分:2)
假设您的格式始终与“ 3月15日14:20:48”相同(如果正确),则它应始终与+'%b %d %T'
相匹配。如果是这样,您不仅可以使用date
来验证格式,而且可以验证内容。
$: ts='Mar 15 14:20:48' # valid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
ok
$: ts='Mar 15 14:2' # valid date/time in wrong format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
mismatch
$: ts='Feb 31 14:20:48' # invalid date/time in correct format
$: [[ "$ts" == "$( date +'%b %d %T' -d "$ts" )" ]] && echo ok || echo mismatch
date: invalid date ‘Feb 31 14:20:48’
mismatch