- A+
bash中,如果想要比较两个数字的大小,最常用的关系运算符就是 "-gt"或者"-lt"了
最简单的示例如下
正如上图所示,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,看看能否与我们想象的一样,示例如下
可以看到,当我们直接使用 "-gt"或者"-lt"比较两个字符串时,语法错误,直接报错了,看来不能这样用。
聪明如你,一定想到了,我们把上例中的"单中括号"换成"双中括号"试试,示例如下
如上图所示,虽然语法上没有报错,但是结果并不正确
字母a的ASCII值明明是小于字母b的ASCII值的
但是,判断字符"a"的ASCII值是否大于字符"b"的ASCII值时,返回值为0(为真),也就是说,与我们期望的值并不一样,换句话说就是,通过 "-gt"或者"-lt"并不能准确的比较出两个字符的ASCII值的大小。
所以,在比较两个字符的ASCII值的大小时,我们需要使用另一种符号,就是">"或者"<"
没错,就是我们最常用的"大于号"或者"小于号",示例如下
如上图所示,当我们想要比较两个字符的ASCII值时,则需要使用">"或者"<"
但是需要注意的一点是,在使用单中括号时,如果想要使用">"或者"<",则需要转义,示例如下
正如上图所示,当使用单中括号时,如果想要使用">"或者"<",则需要转义,如果没有对符号进行转义,虽然语法上没有报错,但是并不能正确的判断出字符的ASCII值的大小,如上图所示,当使用单中括号时,只有对符号进行转义后,才能够正确的判断出两个字符的ASCII值的大小。
综上所述,我们可以得出 结论:
在shell中,"-gt"或者"-lt"只能用于比较两个数字的大小,当我们想要比较两个字符的ASCII值时,则必须使用">"或者"<",而且需要注意,当使用"双中括号"进行判断时,">"或者"<"不用转义即可正常使用,当使用"单中括号"进行判断时,">"或者"<"需要转义后才能正常使用。
那么我们来看一个应用中的小例子
如果我们想要比较两个日期的前后,我们可以将日期的格式转化为纯数字的格式,然后进行比较,数字较大的对应的日期应该较晚,示例如下
但是,有时候我们直接获取到的日期格式可能是字符串格式的,比如"2017-07-30",难道我们必须要把这种格式转换成纯数字格式以后再对比吗?不是的,我们可以直接对比相同字符串格式的日期,日期较晚的字符串转换成ASCII以后,ASCII值应该更大,示例如下
使用上例中的方法,在比较日期的前后时,我们就不用必须转换字符串格式的日期了,省去了一个步骤,还是比较方便的。
好了,这篇文章就总结到这里,希望能够帮助到你~
求关注,求收藏,求推荐~~~

2019年11月1日 下午2:27 沙发
突然感觉lshell的语法好麻烦啊,各种括号。。。。空格。。。。
2018年1月21日 上午10:57 板凳
很抱歉简单的提取了一下网页的源码。。。将这个文章的部分内容提取出来作为笔记。。。因为写的很棒。不会侵权与传播,仅仅是学习备用,假如作者不允许的话请联系邮箱。我会删除的。冒昧之处请多多包涵。
2017年12月13日 下午5:33 地板
[root@salt-control tmp]# [[ 2 > 1 ]]
[root@salt-control tmp]# echo $?
0
[root@salt-control tmp]# [[ 2 > 10 ]]
[root@salt-control tmp]# echo $?
0
[root@salt-control tmp]# [[ 2 -gt 10 ]]
[root@salt-control tmp]# echo $?
1
[root@salt-control tmp]# [[ 3 > 100 ]]
[root@salt-control tmp]# echo $?
0
[root@salt-control tmp]# [[ 3 -gt 100 ]]
[root@salt-control tmp]# echo $?
1
朱兄,双中括号[[ ]] 里面比较数字大小好像是按数字的对应位来比较的。不是按照整体数字的大小来比较。
2017年12月13日 下午5:46 1层
@妞妞 兄弟,是按照ASCII的值比较的,只不过日期转换成相同格式的字符串以后,正好日期大的ASCII值大,所以利用了这一点
可以百度”ASCII码对照表”,找一个在线ASCII码查询网站,把字符串输入进去试试
2017年12月13日 下午6:06 2层
@朱双印 OK,明白了 > < 只能以ASCll 码来比较字符串。不能用来比较数字
2020年9月6日 下午8:39 3层
@妞妞 赞👍
2019年6月15日 下午8:06 2层
@朱双印 准确来说,当使用 “>” 或 “” 和 “<” 比较字符串时,是对应位上的字符逐个进行比较的,比较的依据是字符在系统当前所使用的字符编码中的代码点,并不一定是 ASCII 码。因为如果只是按照字符在 ASCII 编码中的代码点,那么非 ASCII 字符就无法比较了。
2019年6月16日 下午5:44 3层
@灰太狼 666,回来测试一下,加油,共勉~~
2017年10月3日 上午10:13 4楼
博主我想问下你这个文章站内搜索是用的sphinx吗?还想问下比如编译安装完了mysql,那想在mysql增加一个插件,比如sphinx这个该如何操作?
2017年10月4日 下午9:26 1层
@我的电脑 站内搜索用的都是主题自带的,还有百度与360的站内搜索代码,插件这个没用过,不知道怎么弄,没有办法帮到你,加油~~
2017年10月2日 下午10:40 5楼
shell中让人感到痛苦的就是() [[]] [] && || -gt -lt -eq这些符号还有就是0为真,1为假。为什么不按套路出牌把1设定为真,0为假!
2017年10月4日 下午9:15 1层
@我的电脑 0和1这个有过其他编程经验的的确不习惯,其他的也是一种习惯,每次出错都检查一下语法,时间长了就会按照正确的语法写了,加油
2019年5月30日 下午5:19 1层
@我的电脑 其实并不是把0当作真,1当作假,而是把0作为执行成功的返回值,而把非0作为执行失败的返回值;
其他很多编程语言也都是这样的规定的。
大概是因为“正确只有一种,但错误可能有多种”吧……
2019年5月30日 下午8:12 2层
@cc 对的,已经添加了说明,不说明的确容易误解,感谢指正~
2017年9月29日 下午11:16 6楼
弱弱的问下博主,这个微信和支付宝的二维码是不是要先从手机上生成,然后保存到电脑上,然后截取图中的二维码?
2017年9月30日 上午10:39 1层
@我的电脑 微信的可以用电脑直接生成的,网上有好多网站,不过支付宝的我是在手机上弄的,然后电脑截图的,其实怎么样都行