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:如何从变量值重新格式化字符串日期的主要内容,如果未能解决你的问题,请参考以下文章

shell基础2

Shell脚本基础

(转)shell脚本(bash)中[[]]和[]的区别

shell脚本的漂亮打印

02-shell-变量和字符串

shell 快速入门