我是Bash的新手,提前道歉。
设置向上
我的特定结束日期end
取决于特定的开始日期s
和期间长度p
,end=s+p
。
问题
当且仅当今天的日期早于或等于结束日期时,我才想执行命令。
即:执行命令iff date ≤ end
。
代码
s='20/09/2017'
p='1'
end=$( date -j -v +"$p"d -f "%d/%m/%Y" "$s")
if [[ date < “$end” ]];
then
echo 'ok'
fi
有两件事不应该是,
p=1
暗示end = '21/09/2017'
&lt; date = '26/09/2017'
,但我仍然得到ok
。date < “$end”
,但我想要date ≤ “$end”
如何纠正1和2?
答案 0 :(得分:3)
格式化YYYYMMDD
之类的日期时,您只需使用字母数字比较:
start=$(date +'%Y%m%d')
end=$(date +'%Y%m%d')
# -gt means greater than - for example.
# check `help test` to get all available operators
if [ $start -gt $end ] ; then ...
答案 1 :(得分:2)
首先,你需要使用词典编纂的日期格式,这意味着大单位首先出现。我强烈推荐ISO标准YYYY-MM-DD或YYYYMMDD。其次,<=
可以写成-le
(小于或等于)。
答案 2 :(得分:1)
您:
end=$( date -j -v+"$p"d -f "%d/%m/%Y" "$s" )
没有产生你期望的东西:
echo "$end"
Thu Sep 21 14:40:54 CEST 2017
您可以通过以下方式获得预期:
end=$( date -j -v+"$p"d -f "%d/%m/%Y" "$s" +"%d/%m/%Y" )
您的比较:
if [[ date < “$end” ]]; then
表现不像你想象的那样。由于调用date
命令,date
未展开。因此,您的比较是字符串<
和字符串[[.]]
之间的字符串比较("date"
条件表达式上下文中的"Thu Sep 21 14:40:54 CEST 2017"
)。你应该使用类似的东西:
date=$( date )
if [[ "$date" < “$end” ]]; then
相反(但使用date
作为变量名可能不是一个好主意。)
正如其他答案所注意到的那样,您选择的日期格式不是最佳比较。因此,将各种修复与其他明智的建议相结合,您可以尝试类似:
s='20170920'
p='1'
end=$( date -j -v+"$p"d -f "%Y%m%d" "$s" +"%Y%m%d" )
now=$( date +"%Y%m%d" )
if (( now <= end )); then
echo 'ok'
fi
注意:if (( now <= end )); then
是算术比较,它应该适用于这种特定情况。另请注意,它使用now
和end
,而不是$now
和$end
:((.))
算术比较将变量名称解释为存储在变量中的整数值。无论如何,使用日期,即使是YYYYmmdd
格式,就好像它们是整数一样不是那么干净。使用UNIX时间戳(至少在year 2038之前应该没问题)可能更简洁:
s='20170920'
p='1'
end=$( date -j -v+"$p"d -f "%Y%m%d" "$s" +"%s" )
now=$( date +"%s" )
if (( now <= end )); then
echo 'ok'
fi
因为此处now
和end
是自the Epoch以来的秒数,即真正的整数。但请注意,结果可能与之前的解决方案不同,因为您现在有一秒精度而不是一天。选择哪一个符合您的需求。