Bash中比较格式化日期时间字符串报语法错误如何解决?
报错原因
Bash 条件表达式中不存在 <= 这个字符串比较运算符,你写的语法不符合Bash的规则,所以触发了语法报错。
你使用的 %Y/%m/%d %H:%M:%S 格式的时间字符串本身是高位到低位顺序排列的,字典序和时间先后顺序完全一致,有两种常用的比较方案:
方案1:转换为Unix时间戳比较(最推荐)
这种方法兼容性最好,不受时间格式影响,纯数字比较逻辑清晰不易出错:
# 生成时间时直接存储时间戳(单位:秒) dateTimeNowTs=$(date -d 'now' +%s) tokenExpireDateTs=$(date -d 'now + 25 minutes' +%s) # 数字小于等于比较用 -le 运算符 if [[ ${tokenExpireDateTs} -le ${dateTimeNowTs} ]]; then echo "hi" fi
如果你已经有现成的 %Y/%m/%d %H:%M:%S 格式字符串,可以临时转换为时间戳再比较:
dateTimeNowTs=$(date -d "${dateTimeNow}" +%s) tokenExpireDateTs=$(date -d "${tokenExpireDate}" +%s)
方案2:直接字符串比较
不需要转换格式,直接利用该时间格式的字典序特性比较,注意要把<=拆为「小于」加「等于」两个条件组合:
if [[ "${tokenExpireDate}" < "${dateTimeNow}" || "${tokenExpireDate}" == "${dateTimeNow}" ]]; then echo "hi" fi
注意:如果你用单中括号
[ ]做条件判断,<和>需要加反斜杠转义,写法为[ "${tokenExpireDate}" \< "${dateTimeNow}" ],更推荐用双中括号[[ ]]写法,不需要转义可读性更高。
内容的提问来源于stack exchange,提问作者bmoreira18
相关产品推荐
相关产品推荐

