我在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
行的第一个块将显示end
和date1
相同,因为之前的if
语句应该是相同的。第一个until
循环完全符合您的预期:逐个循环,直到now
为date1
之前一分钟。然而,第二个循环永远持续下去。当end
和date1
相同时,这怎么可能?
答案 0 :(得分:0)
在变量之后将回显线上的引号移动到(即 你看(并且认为你的变量中有): 修改 而且存在差异。 要解决此问题,您还需要引用子shell 或者根本不使用子shell和 作为一般规则,总是引用您的变量扩展,而永远使用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
if
块echo
命令中的值。echo
:if [[ "$date1" < "$date2" ]]; then
end=$date1
else
end=$date2
fi
echo
来检查变量值。至少引用你的话。但printf '%q\n' "$variable"
和declare -p variable
(对于bash)对于这项工作来说要好得多。