我经常使用文件名制作文件快照。date +%Y%m%D
.tar.gz 文件名中插入了日期,但有时确实会变得很繁琐。
有没有办法date +%Y%m%D
在总是展开的宏中设置表达式,这样我就可以使用文件名$DATEMACRO.gz。
可以将类似的东西设置为环境变量等吗?
它会节省很多错误。
我能想到的最接近的是shell函数:
# With optional support for a date other than today
DATEMACRO () {
date +%Y%m%d ${1:+--date "$*"}
}
export -f DATEMACRO
为了能够从外壳永久使用这样的宏,必须将它添加到环境中.bashrc
并导出到环境中,例如。export -f DATEMACRO
最好直接在函数定义之后(如上面的原始答案中所修改),使下面的命令可以直接从 shell 执行
cp foo filename$(DATEMACRO).gz
cp bar filename$(DATEMACRO -3 weeks).gz
您需要编写一个函数来获取当前日期:
#!/bin/bash
DATEMACRO() {
date +%Y%m%D
}
echo "myfile_$(DATEMACRO)"
您可以执行以下操作:
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 键上的引号。
bash 无法使用动态变量。但是,bash 借鉴了 ksh 最初引入的一些创新,因此它有朝一日可能会实现ksh93 提供的所谓规则功能。例如:
#!/bin/ksh93
function DATEMACRO.get
{
DATEMACRO=$(date +%Y%m%D)
}
$ echo filename$DATEMACRO.gz
filename20120825.gz
ksh93 缺少 bash 的几个有用的脚本功能,例如浮点运算、FPATH、协同处理,并且还以更合乎逻辑的方式实现管道,因此它可能被视为 bash 的替代品。