Bash变异神秘

时间:2011-05-02 19:35:15

标签: linux bash

因此,在工作中我们使用会计系统,在月末我们必须修改上个月的脚本,并为打印出来的日志指定新名称。因为我很懒,宁愿花时间学习新东西而不是重复同样的任务,我决定编写脚本来为我做这一切并将其设置为cron工作。因为我刚刚开始这项工作,而且我是Bash编程的新手,所以我决定稍微研究一下,找到完成这项工作所需的一切,然后想出来。

#!/bin/bash
month= $(echo $(date --date="last month" +%b))
year=$(echo $(date +%Y))
echo $(date --date="last month" +%Y-%m-%d)
echo $(date --date="yesterday" +%Y-%m-%d)
echo $(date --date="last month" +%b)
echo garuda-summary-$month$year.log;

并打印出此

test.sh: line 2: Apr: command not found
2011-04-02
2011-05-01
Apr
computer-summary-2011.log

所以我玩了一些,并让这个工作。但它很难看,我想知道它为什么以前不起作用。谢谢你

#!/bin/bash
month= $(echo $(date --date="last month" +%b))
year=$(echo $(date +%Y))
echo $(date --date="last month" +%Y-%m-%d)
echo $(date --date="yesterday" +%Y-%m-%d)
echo $(date --date="last month" +%b)
echo garuda-summary-$(date --date="last month" +%b)$year.log;

3 个答案:

答案 0 :(得分:5)

test.sh: line 2: Apr: command not found

是因为在分配到月份时“=”后面有空格。这个空间让bash认为4月($(日期 - 日期 - 日期=“上个月”+%b))的输出是你要调用的命令。

这也会导致未在shell中设置月份,因为在与变量赋值相同的行上指定命令会告诉bash仅在调用指定命令时使用此变量值。

答案 1 :(得分:1)

首先,您不需要通过echo在子shell中执行所有操作。这应该是等效的,更容易使用:

#!/bin/bash
month=`date --date="last month" +%b`
year=`date +%Y`
date --date="last month" +%Y-%m-%d
date --date="yesterday" +%Y-%m-%d
date --date="last month" +%b
echo garuda-summary-$month$year.log

答案 2 :(得分:1)

您可以通过以下方式免除$( ...)内容:

year=`date +%Y`
month=`date --date='last month'`

等等,这应该会在一定程度上改善易读性。

同样,您可能想要检查当前月份是任何一年的月份时会发生什么。您将为您的日期生成“2011年12月”,而不是“2010年12月”。