Shell中YYYYMM格式日期变量转当月首日YYYYMMDD报错解决
问题原因
原命令报错来自两个核心问题:
- 变量引用写法错误:你贴出的命令里
-d"fvd"没有加变量引用符$,传入date的会是固定字符串fvd;从你贴的报错信息invalid date '202201'看,实际执行时你应该是补了$传入了变量值,但依然触发报错,核心是第二个问题。 - 日期格式不兼容:Linux系统默认的GNU date无法直接识别纯
YYYYMM格式的6位数字字符串,无法完成日期解析,就会抛出无效日期错误。
实现方案
方案1:直接字符串拼接(最高效、无依赖)
因为你的需求是给固定6位的YYYYMM格式值补后缀01,完全不需要调用date做日期解析,直接拼接字符串即可,不受date版本、解析规则限制:
# 定义原始变量 fvd=202201 # 直接在变量值后拼接01 fvd_yyyymmdd="${fvd}01"
执行后fvd_yyyymmdd的值就是预期的20220101。
注意:这个方案不会校验
fvd的合法性,如果fvd可能出现非法值(比如202213代表不存在的13月),需要选下面带校验的方案。
方案2:调用date做解析(带合法性校验)
如果需要自动校验年月的合法性(遇到非法年月直接报错,不会生成错误日期),可以把YYYYMM格式的输入转成date能识别的YYYY-MM-01结构再解析,输出标准YYYYMMDD格式:
fvd=202201 # 拆分年、月字段,拼接为年月首日的标准格式传入date解析 fvd_yyyymmdd=$(date -d "${fvd:0:4}-${fvd:4:2}-01" +%Y%m%d)
如果fvd的值是非法年月(比如202213),date会直接抛出invalid date错误,不会生成错误的结果值。
原命令修正说明
哪怕你给变量补了$符号,直接把6位YYYYMM值传给-d参数依然会报错,必须补全为带日的标准日期结构才能被date正常识别,不要直接传纯年月数字串。
内容的提问来源于stack exchange,提问作者Prashant Rawool
相关产品推荐
相关产品推荐

