打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【转】linux shell bash 比较操作

【转】linux shell bash 比较操作

4人收藏此文章, 我要收藏 发表于2个月前 , 已有123次阅读 共0个评论
整数比较
-eq 等于,如:if [ "$a" -eq "$b" ] 
-ne 不等于,如:if [ "$a" -ne "$b" ]
-gt 大于,如:if [ "$a" -gt "$b" ]
-ge 大于等于,如:if [ "$a" -ge "$b" ]
-lt 小于,如:if [ "$a" -lt "$b" ]
-le 小于等于,如:if [ "$a" -le "$b" ]

< 小于(需要双括号),如:(("$a" < "$b"))
<= 小于等于(需要双括号),如:(("$a" <= "$b"))
> 大于(需要双括号),如:(("$a" > "$b"))
>= 大于等于(需要双括号),如:(("$a" >= "$b"))

字符串比较

= 等于,如:if [ "$a" = "$b" ]
== 等于,如:if [ "$a" == "$b" ],与=等价

注意: [[]]和[]中的行为在某些情况下是不同的: 

[[ $a == z* ]]           # 如果$a 以"z"开头 (模式匹配)那么将为true
[[ $a == "z*" ]]         # 如果$a 等于z*  (字符匹配),那么结果为true

[ $a == z* ]             # File globbing 和word splitting 将会发生 
[ "$a" == "z*" ]        # 如果$a 等于z* (字符匹配),那么结果为true

File globbing 是一种关于文件的速记法,比如"*.c"就是,再如~也是.
但是file globbing 并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

(笔者不太懂, 假如在/tmp目录下有一个a.txt文件,则[ "a.txt" = a.* ]会返回逻辑真,但如果/tmp下有a.txt和a.out两个文件,则这样写Shell会报错) 

!= 不等于,如:if [ "$a" != "$b" ]
注意: != 在[[]]结构中使用模式匹配.

< 小于,在ASCII 字母顺序下.如:
if [[ "$a" < "$b" ]]
if [ "$a" \< "$b" ]
注意:在[]结构中"<"需要被转义.

> 大于,在ASCII 字母顺序下.如:
if [[ "$a" > "$b" ]]
if [ "$a" \> "$b" ]
注意:在[]结构中">"需要被转义.

-z 字符串为空.就是长度为0.
-n 字符串不为空
注意: 对于字符串或数字的比较, 加上双引号("")是没有坏处的, 而且能避免一些不必要的麻烦(请参考,但模式和正则表达式不能加双引号.
 

混合比较
-a 逻辑与
exp1 -a exp2     如果exp1 和exp2 都为true 的话,这个表达式将返回true
-o 逻辑或
exp1 -o exp2    如果exp1 和exp2 中有一个为true 的话,那么这个表达式就返回true

但在[[]]使用&&和|| 代替 -a 和 -o,  -o 和-a 一般都是搭配 test 命令或者[]

看一些例子:
01#!/bin/bash
02# 数字和字符串比较
03 
04# 这里的变量a 和b 既可以当作整型也可以当作是字符串.
05# 因为Bash 变量并不是强类型的.
06a=4
07b=5
08# a,b作为整数进行比较
09if [ "$a" -ne "$b" ]
10then
11    echo "$a is not equal to $b"
12    echo "(arithmetic comparison)"
13fi
14echo
15# a,b作为字符串进行比较
16if [ "$a" != "$b" ]
17then
18     echo "$a is not equal to $b."
19     echo "(string comparison)"
20fi
21 
22# 在这个特定的例子中,"-ne"和"!="都可以.
23 
24exit 0

 

01#!/bin/bash
02# 测试字符串是否为null
03# $string1 没被声明和初始化
04if [ -n $string1 ]
05then
06    echo "String \"string1\" is not null."
07else
08    echo "String \"string1\" is null."
09fi
10# 错误的结果.
11# 显示$string1 为非空,虽然他没被初始化.
12 
13echo
14 
15# 给$string1加上双引号再试一下.
16if [ -n "$string1" ]
17then
18    echo "String \"string1\" is not null."
19else
20    echo "String \"string1\" is null."
21fi
22# 这次输出我们预期的结果
23 
24echo
25 
26if [ $string1 ] # 这次$string1 变成"裸体"的了,相当于[ -n $string1 ]
27then
28    echo "String \"string1\" is not null."
29else
30    echo "String \"string1\" is null."
31fi
32 
33string1=initialized
34if [ $string1 ] # 再来
35then
36    echo "String \"string1\" is not null."
37else
38    echo "String \"string1\" is null."
39fi
40# 这次输出我们期望的结果
41 
42# 但最好还是给字符串加上双引号"", 因为这可以避免不必要的麻烦,也是一种好习惯
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Bash技巧:使用[[命令的 =~ 操作符判断字符串的包含关系
和即将用到Shell的人们谈谈Shell变量
shell复习摘要(三)
10 个实战及面试常用 Shell 脚本编写
PHP学习第一课
Linux中shell文件操作大全
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服