Shell脚本计算GitHub PR创建时间差时date命令报错如何解决
问题根因
报错是连锁问题导致的:
- 运行环境为macOS时,系统默认自带的是BSD版本的
date工具,不支持Linux下GNU版date的-d(指定待解析日期)参数,传入ISO格式的PR创建时间后直接触发格式错误,子命令无有效返回值。 - 从执行日志看,存储PR创建时间的
Created_Date变量值额外包裹了双引号(日志打印为"2022-05-26T17:50:36Z"),多余的引号也会导致日期解析逻辑失效。 - date命令执行失败后,算术运算表达式中减号后缺少有效操作数,最终触发
syntax error: operand expected的语法报错。
解决方案
根据使用场景二选一即可。
方案1:适配macOS原生BSD date(无需额外安装软件)
BSD版date需要通过-f参数指定输入日期的格式,同时必须加-j参数避免误修改系统时间,修改后的代码如下:
# 先清除变量中多余的包裹引号 Created_Date=$(echo "${Created_Date}" | tr -d '"') # 计算日期间隔 DIFFERENCE_DAYS=$(( ($(date '+%s') - $(date -j -f "%Y-%m-%dT%H:%M:%SZ" "${Created_Date}" '+%s')) / 86400 ))
参数说明:
-j:仅做日期解析输出,不修改系统时间,BSD环境下必加-f "%Y-%m-%dT%H:%M:%SZ":指定输入日期为UTC时区的ISO8601格式,和GitHub返回的PR创建时间格式完全匹配
方案2:兼容多环境的通用写法
如果需要脚本同时兼容Linux和macOS,可以安装GNU版coreutils统一命令行为,再做环境自动适配:
- macOS下先通过Homebrew安装GNU工具集:
brew install coreutils - 脚本中增加命令适配逻辑:
# 自动识别当前环境的GNU date命令 if command -v gdate >/dev/null 2>&1; then DATE_BIN="gdate" else DATE_BIN="date" fi # 清除变量多余引号 Created_Date=$(echo "${Created_Date}" | tr -d '"') # 计算日期间隔 DIFFERENCE_DAYS=$(( ($($DATE_BIN '+%s') - $($DATE_BIN '+%s' -d "${Created_Date}")) / 86400 ))
注意事项
- 计算逻辑通过秒级时间戳差除以86400(单日秒数)得到间隔天数,结果为向下取整的整数,满足"创建超过5天"的判断需求
- GitHub返回的PR创建时间带
Z后缀标识为UTC时区,两种方案的解析逻辑都会正确识别时区,不会出现时间偏差
内容的提问来源于stack exchange,提问作者Mohan V
相关产品推荐
相关产品推荐

