可以将日期命令宏化

时间:2012-08-24 21:17:23

标签: bash shell date macros expansion

我经常使用文件名创建文件快照。date +%Y%m%D。tar.gz其中日期插入文件名中,但它确实有些繁琐。

有没有办法在宏中设置date +%Y%m%D表达式,它总是会扩展,所以我可以使用文件名$ DATEMACRO.gz。

可以将类似的东西设置为环境变量等吗?

这会节省很多错误。

4 个答案:

答案 0 :(得分:3)

我能想到的最接近的是shell函数:

# With optional support for a date other than today
DATEMACRO () {
    date +%Y%m%d ${1:+--date "$*"}
}
export -f DATEMACRO

为了能够永久地从shell中使用这样的宏,必须将其添加到.bashrc并导出到环境中,例如。 export -f DATEMACRO最好直接在函数定义之后(在上面的原始答案中修改),使下面的命令直接从shell执行

cp foo filename$(DATEMACRO).gz

cp bar filename$(DATEMACRO -3 weeks).gz

答案 1 :(得分:3)

您需要编写一个函数来获取当前日期:

#!/bin/bash

DATEMACRO() {
  date +%Y%m%D
}
echo "myfile_$(DATEMACRO)"

答案 2 :(得分:1)

您可以执行以下操作:

cienas > 23:24 ~ > export D="date +%Y-%m-%d-%H-%M-%S.tar.gz"
cienas > 23:24 ~ > echo `$D`
2012-08-24-23-25-02.tar.gz
cienas > 23:25 ~ > cp .profile `$D`

我添加时间戳只是为了看它是否有效。在.basrc文件中导出D,然后您可以使用$D获取当前日期和时间。请注意,$ D附近的这些报价是关于tilda密钥的。

答案 3 :(得分:1)

无法使用bash获得动态变量。但是,bash借用了ksh最初引入的一些创新,因此有朝一日可能会实现所谓的discipline functions ksh93提供。例如:

#!/bin/ksh93
function DATEMACRO.get
{
    DATEMACRO=$(date +%Y%m%D)
}

$ echo filename$DATEMACRO.gz
filename20120825.gz

ksh93有几个有用的脚本功能bash缺失,比如浮点运算,FPATH,协同处理,并且还以更合理的方式实现管道,因此可以将其视为bash的替代方案。