Bash shell:如何从变量值重新格式化字符串日期
Posted
技术标签:
【中文标题】Bash shell:如何从变量值重新格式化字符串日期【英文标题】:Bash shell: How to reformat string date from a variable value 【发布时间】:2022-01-12 00:51:25 【问题描述】:我了解如何使用date
命令重新格式化日期,我对此很好。但是,我正在努力解决一个问题——我想重新格式化的日期是另一个命令的输出,所以我将它存储在变量中。我正在为如何指定要获取一个命令的输出并通过date -d
运行它并将其存储在另一个变量中的语法而苦苦挣扎。这是我尝试过的:
expdate=`get_expire_date.sh`
echo $expdate
Mon 23 Mar 2022 05:05:05 PM UTC
expdval=`date -d'($expdate)'`
echo $expdval
我得到的是今天的日期,而不是脚本输出中转换后的过期日期。当然,如果我不使用括号,它会将 $expdate 视为要翻译的文字并给出错误,而如果我不使用单引号,它会使用日期字符串中的空格作为分隔符,并且只获取第一个令牌。
我做错了什么?
【问题讨论】:
请将get_expire_date.sh
的输出添加到您的问题中。
expdval=$(date -d"$expdate")
(假设$expdate
的格式为date
所理解的格式——这又回到赛勒斯关于get_expire_date.sh
输出的问题)
@Fravadona,不,date -d
不将文件名作为参数。进程替换看起来像文件(例如echo <(pwd)
)
糟糕,我的错:echo "$(date -d "$(./get_expire_date.sh)")"
还要考虑到-d
的含义在不同平台上会发生变化
【参考方案1】:
首先,参数扩展不会出现在单引号内。您需要更改单引号
expdval=`date -d'($expdate)'`
双引号
expdval=`date -d"($expdate)"`
其次,括号创建了一个无效的输入,这会导致(出于我不太了解的原因)当天午夜的输出。 (您会得到与无效日期 date -d ""
相同的结果。)
去掉括号,你会得到相同的日期(因为输入格式与默认输出格式匹配)。
$ date -d "$expdate"
Wed Mar 23 13:05:05 EDT 2022
要实际操作它,您需要一个明确的输出格式:
$ date -d "$expdate" +%Y-%m-%d
2022-03-23
或某种形式的日期“算术”:
$ date -d "$expdate + 2 days"
Fri Mar 25 13:05:05 EDT 2022
【讨论】:
谢谢,这是一个更完整的答案。【参考方案2】:我发现我不得不改用双引号,就像这样(对不起旧的做事方式,更新到新的 shell 语法):
expdval=$(date -d"$(get_expire_date.sh)")
【讨论】:
“新的 shell 语法”自 1990 年左右就出现了!以上是关于Bash shell:如何从变量值重新格式化字符串日期的主要内容,如果未能解决你的问题,请参考以下文章