如何修复UNIX下Shell脚本的输入缺失与日期格式验证问题?
修复日期验证脚本的异常问题
原脚本存在的问题
原脚本用于验证输入缺失、日期格式及日期a是否小于b,但执行时出现多类异常:
- 输入正确格式日期仍触发"INVALID DATE"提示
- 无输入/仅单个输入时,先输出date错误再提示Missing inputs
- 输入
5/4/1999 6/4/1999仍提示日期无效
修复后的完整脚本
#!/bin/bash # 先检查输入参数数量 if [ $# -ne 2 ]; then echo "Missing inputs" exit 255 fi # 定义目标日期格式 DATE_FORMAT="+%m/%d/%Y" # 验证并转换第一个日期输入 if ! a=$(date -d "$1" "$DATE_FORMAT" 2>/dev/null); then echo "INVALID DATE: $1" exit 255 fi # 验证并转换第二个日期输入 if ! b=$(date -d "$2" "$DATE_FORMAT" 2>/dev/null); then echo "INVALID DATE: $2" exit 255 fi # 转换为时间戳进行数值比较 timestamp_a=$(date -d "$a" +%s) timestamp_b=$(date -d "$b" +%s) if [ "$timestamp_a" -ge "$timestamp_b" ]; then echo "a should be less than b" exit 255 fi echo "All validations passed"
关键修复说明
提前检查参数数量
原脚本先执行date命令再检查输入,导致无输入时date先抛出错误。现在先判断参数数量是否为2,不符合直接提示缺失输入,避免无效错误输出。正确捕获日期格式错误
- 用
2>/dev/null屏蔽date的默认错误输出,避免干扰自定义提示 - 通过
if ! ...判断date命令执行状态:输入格式无效时date返回非0值,直接触发无效日期提示
- 用
修正格式验证逻辑
原脚本错误地将转换后的日期与格式字符串+m/%d/%Y对比,逻辑完全颠倒。现在通过date命令的执行结果判断格式合法性,更准确可靠。用时间戳做日期比较
原脚本直接比较日期字符串,存在月份/日期位数不一致时的比较误差。转换为Unix时间戳(%s)后做数值比较,结果精准无歧义。清理冗余代码
删除原脚本中残留的无效测试代码(date: invalid date '+m/%d/%Y'和Missing inputs行),避免干扰脚本执行流程。
内容的提问来源于stack exchange,提问作者Eweys Jayce
相关产品推荐
相关产品推荐

