Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何从终端读取日期并与当前日期进行比较_Linux_Shell_Unix_Date - Fatal编程技术网

Linux 如何从终端读取日期并与当前日期进行比较

Linux 如何从终端读取日期并与当前日期进行比较,linux,shell,unix,date,Linux,Shell,Unix,Date,我想知道使用shell脚本从终端读取日期并与当前日期进行比较的适当方式 我有下面的脚本 a=`date +%Y-%m-%d` while [ 1 ] ; do echo "Enter Date" read todate if [ $todate < $a ];then break; fi echo "todate greater than curDate" done a=`date+%Y-%m-%d` 而[1];做 回显

我想知道使用shell脚本从终端读取日期并与当前日期进行比较的适当方式

我有下面的脚本

a=`date +%Y-%m-%d`
while [ 1 ] ; do
        echo "Enter Date"
    read todate
    if [ $todate < $a ];then
        break;
    fi
    echo "todate greater than curDate" 
done 
a=`date+%Y-%m-%d`
而[1];做
回显“输入日期”
阅读今天的文章
如果[$todate<$a];然后
打破
fi
回显“todate大于curDate”
完成
它没有按预期运行。请帮帮我

更新

这是我的最终版本

#! /bin/bash
DATE=$(date '+%s')
while [ 1 ] ; do
        echo "Enter Date[DD MM YYYY]:"    
    read D M Y
    THIS=$(date -d "$Y-$M-$D" '+%s')

    if (( THIS < DATE )) ; then
        break
    fi
done
#/bin/bash
日期=$(日期'+%s')
而[1];做
echo“输入日期[DD-MM-YYYY]:”
读D M Y
THIS=$(日期-d“$Y-$M-$d”+%s”)
如果((本<日期));然后
打破
fi
完成

谢谢大家

日期具有
+%s
格式

 %s     seconds since 1970-01-01 00:00:00 UTC
以秒为单位保存当前日期。然后将用户输入的日期也转换为秒。这样你就可以比较了

7.3。其他比较运算符

字符串比较

<
小于,按ASCII字母顺序排列
如果[[“$a”<“$b”]]
如果[“$a”\<“$b”]
请注意,“以下是解决方案:
在这个解决方案中,我将日期转换为单个整数,很明显,较大的日期总是比当前日期大
a=
date+%Y%m%d

而[1];做

回显“输入日期” 阅读今天的文章 回显“$todate”>温度


完成

使用此处解释的日期命令:谢谢,让我检查一下。
[$todate<$a]
使用参数
$todate]
调用命令
[
,并从变量
a
中指定的文件重定向输入。我怀疑这不是您想要的。使用
[$a-lt$b]
比较整数。你说得对!感谢你指出:)因为不是每个
日期都支持
%s
,这稍微更便于携带,但需要注意的是,你必须始终使用YMD顺序和零填充(如原始问题中的
+%Y-%m-%d
)。请注意,并非所有版本的
[
(也不是所有
[
是内置的shell)都将接受

<
    is less than, in ASCII alphabetical order

    if [[ "$a" < "$b" ]]

    if [ "$a" \< "$b" ]

    Note that the "<" needs to be escaped within a [ ] construct.
   if [ $todate < $a ];then
if [ $todate \< $a ];then
if [[ $todate < $a ]];then
for i in 1 2 3
    do 
      y=`cut -d- -f$i temp`
      x=$x$y
    done 
if [ $x -lt $a ];then
    exit;
fi
echo "todate greater than curDate"