比较两个日期值时出错

时间:2013-12-10 17:52:37

标签: linux shell

Shell脚本适用于其他日期,但不适用于2013-12-08和2013-12-09日期 以下是我正在尝试的代码 - :

  dateToLook=`(date +%d-%m-%Y --date='1 days ago')`
dateToLookY=`(date +%Y-%m-%d --date='1 days ago')`
last=`grep "cricket"  /root/live/test.csv | sed 's/"//g'| awk  'BEGIN { FS = "," } ; { print $8 }' | awk  'BEGIN { FS = " " } ; { print $1 }' | grep "$dateToLookY" | head -1`
d=`(date +%Y-%m-%d --date='1 days ago')`
echo $last--$d
if [[ $d -eq $last ]];
then
echo "deepak"
else
echo "condition does not match"
fi

当这两个变量回显时,它们给出相同的值,但如果在“if”条件下进行比较则返回false,否则执行条件。 下面是我正在尝试使用test.csv的文件 - :

"@yahoo.com","123","40","M","i","1.3","2013-11-19","2013-12-08"
"@yahoo.com","123","40","M","i","1.3","2013-11-19","2013-12-08"

我曾经浏览过网络而不知道为什么会发生同样的代码工作时我在Test.csv中用2013-12-06修改日期

1 个答案:

答案 0 :(得分:1)

if [[ $d -eq $last ]];

测试整数相等,你想在这里进行字符串测试,如

if [[ $d = $last ]];

有点令人惊讶的是,你的shell在这里没有给你一个合理的错误信息,当我在(一个相当古老的)bash中尝试这个时,我得到了

[[: 2013-12-08: value too great for base (error token is "08")

解释:[[看到数字表达式中的数字和每个以0开头的C约定数字被解释为八进制,这解释了为什么06和07将起作用,08和09不起作用。 [[也是十六进制的,请参阅here

但是在这种情况下你想要字符串比较,所以解释的最后部分实际上并不真正相关,它只是解释了错误。

来自Bash Reference Manual

  

[[...取决于条件表达式表达式的评估,返回0或1的状态。表达式由下面在Bash条件表达式中描述的原色组成。

和条件表达式章节:

string1 == string2
string1 = string2

    True if the strings are equal. ‘=’ should be used with the test command
    for POSIX conformance.