2016-07-27 108 views
0

我想从日期中减去整数。基本上我想说如果是在本月15号之前,那么从月份中减去1。所以如果一天是05-05-2016,我想用04作为月份。外壳 - 从日期中减去整数

Month=`date +%m` 
Day=`date +%d` 

If [ $Day -lt 15 ] 
    then 
     Output_Month=$Month - 1 
fi 

这似乎没有工作,因为我认为它们有两种不同的格式(日期和整数)。我怎样才能减去一个月或将月份转换为整数?

+0

您可能会发现[ShellCheck(http://shellcheck.net)是有用的。它自动建议“使用$((...))进行算术运算,例如i = $((i - 2))”和“Scripts区分大小写,使用'if'而不是'If'。 –

+0

[Unix shell脚本中的Date算术]的可能重复(http://stackoverflow.com/questions/6467/date-arithmetic-in-unix-shell-scripts) – gattsbr

回答

2

date命令是很聪明的,你可以这样写:

if [ $Day -lt 15 ]; then 
    Output_Month=$(date -d "-1 month" +%m) 
fi 
+0

谢谢!这工作 – Buddy

0

让我们对算术运算符之前和之后的空格有点挑剔。这应该有助于你得到你的答案:

#!/bin/ksh 

Month=`date +%m` 
Day=`date +%d` 

if [ $Day -lt 15 ] 
then 
    let Output_Month=$Month-1 
    echo $Output_Month 
else 
    let Output_Month=$Month+1 
    echo $Output_Month 
fi 

我加入测试控制块,因为今天是明显的15的目标日期上面这是27日因此要获得任何输出,我不得不填充else子句。

2

首先,你有错字:这是if(小写),而不是If。 做算术,你可以使用$((..))构造。因此,它可以写成:

另外,请注意我在计算Month使用的-。这是因为date +%d打印与领先0和任何数字与领先是八进制号码。所以,如果您的Month0809那么这将是一个错误。 使用-可抑制领先的0

0
if [ "$Day" -lt "15" ] # No harm double quoting $Day, note this is integer comparison 
    then 
     ((Output_Month = Month - 1)) #You may omit $ inside ((..)) construct 
fi