bash中的日期处理,无法解释的行为

时间:2015-11-04 13:36:48

标签: bash date

我在bash脚本中处理日期时遇到了一些令人抓狂的问题。从脚本中删除其他所有内容后,我可以使用以下脚本重现该行为:

#!/bin/bash

date1=`date -u -d "2015-11-04 11:54"`
date2=`date -u -d "2015-11-04 11:55"`

start=`date -u -d "2015-11-04 9:25:00"`
end=`if [[ "$date1" < "$date2" ]];then echo $date1;else echo $date2;fi`

now=$start
echo "now   = "$now
echo "end   = "$end
echo "date1 = "$date1

until [ "$now" == "$date1" ]
do
    echo $now
    now=$(date -u -d "$now 1 minute")
done
echo "first loop done"

now=$start
until [ "$now" == "$end" ]
do
    echo $now
    now=$(date -u -d "$now 1 minute")
done
echo "second loop done"

exit 0

echo行的第一个块将显示enddate1相同,因为之前的if语句应该是相同的。第一个until循环完全符合您的预期:逐个循环,直到nowdate1之前一分钟。然而,第二个循环永远持续下去。当enddate1相同时,这怎么可能?

1 个答案:

答案 0 :(得分:0)

在变量之后将回显线上的引号移动到(即echo "end = $end"echo "date1 = $date1"),您将看到之前缺少的差异。< / p>

你看(并且认为你的变量中有):

now   = Wed Nov 4 09:25:00 UTC 2015
end   = Wed Nov 4 11:54:00 UTC 2015
date1 = Wed Nov 4 11:54:00 UTC 2015

修改echo上的变量引用然后得到:

now   = Wed Nov  4 09:25:00 UTC 2015
end   = Wed Nov 4 11:54:00 UTC 2015
date1 = Wed Nov  4 11:54:00 UTC 2015

而且存在差异。

要解决此问题,您还需要引用子shell ifecho命令中的值。

或者根本不使用子shell和echo

if [[ "$date1" < "$date2" ]]; then
    end=$date1
else
    end=$date2
fi

作为一般规则,总是引用您的变量扩展,而永远使用echo来检查变量值。至少引用你的话。但printf '%q\n' "$variable"declare -p variable(对于bash)对于这项工作来说要好得多。