2

我经常使用文件名制作文件快照。date +%Y%m%D.tar.gz 文件名中插入了日期,但有时确实会变得很繁琐。

有没有办法date +%Y%m%D在总是展开的宏中设置表达式,这样我就可以使用文件名$DATEMACRO.gz。

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

它会节省很多错误。

4

4 回答 4

3

我能想到的最接近的是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
于 2012-08-24T21:22:01.830 回答
3

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

#!/bin/bash

DATEMACRO() {
  date +%Y%m%D
}
echo "myfile_$(DATEMACRO)"
于 2012-08-24T21:27:40.397 回答
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 键上的引号。

于 2012-08-24T21:27:33.610 回答
1

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

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

$ echo filename$DATEMACRO.gz
filename20120825.gz

ksh93 缺少 bash 的几个有用的脚本功能,例如浮点运算、FPATH、协同处理,并且还以更合乎逻辑的方式实现管道,因此它可能被视为 bash 的替代品。

于 2012-08-25T01:15:39.643 回答