在KSH中将字符串转为日期并实现日期比较的技术问询
KSH日期读取与比较的正确实现
你的代码主要存在几个核心问题:
- 变量赋值时
expD =...多了空格,KSH里变量赋值的等号前后不能有空格 - 不能直接把输入的字符串当作命令执行,必须用
date命令解析输入的日期字符串 - 用
%d-%m-%Y格式直接比较日期会出现逻辑错误(比如01-12-2023字符串比30-11-2023小,但实际日期是12月1日更晚),建议转成YYYYMMDD格式再做比较
下面是修正后的完整代码:
# 读取用户输入的日期(示例输入:31-12-2023) read expdate # 将当前日期转为YYYYMMDD格式,方便直接做数值比较 today=$(date +"%Y%m%d") # 把输入的日期字符串转成YYYYMMDD格式(适用于GNU date环境,比如Linux) expD=$(date -d "$expdate" +"%Y%m%d") # 如果是BSD date环境(比如macOS),替换成下面这行赋值: # expD=$(date -j -f "%d-%m-%Y" "$expdate" +"%Y%m%d") # 执行日期比较,-gt表示数值大于 if [ "$today" -gt "$expD" ]; then echo "当前日期晚于过期日期" else echo "当前日期未超过过期日期" fi
额外实用提示:
如果需要确保用户输入格式正确,可以提前做格式校验(以dd-mm-yyyy为例):
if [[ ! "$expdate" =~ ^[0-9]{2}-[0-9]{2}-[0-9]{4}$ ]]; then echo "输入格式错误,请使用dd-mm-yyyy格式" exit 1 fi
另外原代码中if [today -gt expD]的错误在于:没有用$引用变量,且[和]前后必须保留空格。
内容的提问来源于stack exchange,提问作者Jason
相关产品推荐
相关产品推荐

