• shell中’-gt’与’>’的区别


      参考:http://www.zsythink.net/archives/2224

      bash中,如果想要比较两个数字的大小,最常用的关系运算符就是 "-gt"或者"-lt"了

      最简单的示例如下

    [root@node1 ~]# a=3
    [root@node1 ~]# b=2
    [root@node1 ~]# [ $a -gt $b ]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [[ $a -gt $b ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [ $a -lt $b ]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [[ $a -lt $b ]]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# 
    

       正如上图所示,a=3,b=2,当比较两个变量时,判断变量a的值是否大于变量b的值时,返回值为0,即结果为真,判断变量a的值是否小于变量b的值时,返回值为1,即结果为假(非零值为假)。

      但是细心如你一定注意到了,在上例中,两个变量的值均为数字,所以我们可以使用关系运算符"-gt"或者"-lt"比较两个数字的大小。

      

      如果是两个字符串进行比较呢?

      我们知道,字符在ASCII表中都有对应的值

      字母a在ASCII表中对应的十进制数值为97

      字母b在ASCII表中对应的十进制数值为98

      也就是说,字母a的ASCII值应该是小于字母b的ASCII值的

      那么,我们使用关系运算符,比较一下字母a与字母b,看看能否与我们想象的一样,示例如下

    [root@node1 ~]# [ "a" -gt "b" ]
    -bash: [: a: 期待整数表达式
    [root@node1 ~]# [ "a" -lt "b" ]
    -bash: [: a: 期待整数表达式
    

       可以看到,当我们直接使用 "-gt"或者"-lt"比较两个字符串时,语法错误,直接报错了,看来不能这样用。

      聪明如你,一定想到了,我们把上例中的"单中括号"换成"双中括号"试试,示例如下

    [root@node1 ~]# [[ "a" -gt "b" ]]
    [root@node1 ~]# [[ "a" -lt "b" ]]
    [root@node1 ~]# [[ "a" -gt "b" ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [[ "a" -lt "b" ]]
    [root@node1 ~]# echo $?
    1
    

       如上图所示,虽然语法上没有报错,但是结果并不正确

      字母a的ASCII值明明是小于字母b的ASCII值的

      但是,判断字符"a"的ASCII值是否大于字符"b"的ASCII值时,返回值为0(为真),也就是说,与我们期望的值并不一样,换句话说就是,通过 "-gt"或者"-lt"并不能准确的比较出两个字符的ASCII值的大小。

      所以,在比较两个字符的ASCII值的大小时,我们需要使用另一种符号,就是">"或者"<"

      没错,就是我们最常用的"大于号"或者"小于号",示例如下

    [root@node1 ~]# [[ "a" > "b" ]]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [[ "a" < "b" ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# 
    

       如上图所示,当我们想要比较两个字符的ASCII值时,则需要使用">"或者"<"

      但是需要注意的一点是,在使用单中括号时,如果想要使用">"或者"<",则需要转义,示例如下

    [root@node1 ~]# [ "a" > "b" ]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [ "a" < "b" ]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [ "a" > "b" ]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [ "a" < "b" ]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# 
    

       正如上图所示,当使用单中括号时,如果想要使用">"或者"<",则需要转义,如果没有对符号进行转义,虽然语法上没有报错,但是并不能正确的判断出字符的ASCII值的大小,如上图所示,当使用单中括号时,只有对符号进行转义后,才能够正确的判断出两个字符的ASCII值的大小。

       综上所述,我们可以得出 结论:

      在shell中,"-gt"或者"-lt"只能用于比较两个数字的大小,当我们想要比较两个字符的ASCII值时,则必须使用">"或者"<",而且需要注意,当使用"双中括号"进行判断时,">"或者"<"不用转义即可正常使用,当使用"单中括号"进行判断时,">"或者"<"需要转义后才能正常使用。

       那么我们来看一个应用中的小例子

      如果我们想要比较两个日期的前后,我们可以将日期的格式转化为纯数字的格式,然后进行比较,数字较大的对应的日期应该较晚,示例如下

    [root@node1 ~]# [[ 20170730 > 20170329 ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [[ 20170730 < 20170329 ]]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [[ 20170730 -gt 20170329 ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [[ 20170730 -lt 20170329 ]]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# 
    

       但是,有时候我们直接获取到的日期格式可能是字符串格式的,比如"2017-07-30",难道我们必须要把这种格式转换成纯数字格式以后再对比吗?不是的,我们可以直接对比相同字符串格式的日期,日期较晚的字符串转换成ASCII以后,ASCII值应该更大,示例如下

    [root@node1 ~]# [[ "2017-07-30" > "2017-03-29" ]]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [[ "2017-07-30" < "2017-03-29" ]]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# [ "2017-07-30" > "2017-03-29" ]
    [root@node1 ~]# echo $?
    0
    [root@node1 ~]# [ "2017-07-30" < "2017-03-29" ]
    [root@node1 ~]# echo $?
    1
    [root@node1 ~]# 
    

       使用上例中的方法,在比较日期的前后时,我们就不用必须转换字符串格式的日期了,省去了一个步骤,还是比较方便的。







  • 相关阅读:
    java如何将char类型的数字转换成int型的数字,而不是Ascii
    java 二分查找的注意事项
    IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
    java中Math的常用方法整理
    判断字符串是否可由重复子字符串组成
    P3558 [POI2013]BAJ-Bytecomputer
    BZOJ 3329. Xorequ
    Codeforces 1221F. Choose a Square
    Codeforces 1221E. Game With String
    Codeforces 1221D. Make The Fence Great Again
  • 原文地址:https://www.cnblogs.com/minseo/p/13718074.html
Copyright © 2020-2023  润新知