判断命令test一般用于脚本当中,可以简写为中括号[ ]。其会对跟随的条件进行判断,一般可以分为数值判断、字符串判断和文件判断。语法格式为test [判断条件]或[ 判断条件 ],注意中括号[ ]与判断条件之间必须存在空格,还需注意判断条件的判断符号与比较值之间也需要存在空格。

  如果是test单独使用,如果判断条件为真,那么echo $?会返回0,判断条件为假返回1。

(1).数值判断

判断符号 说明 范例
-eq 相等则为真  [ $a -eq $b ]
-ne  不等则为真  [ $a -ne $b ]
-gt  大于则为真  [ $a -gt $b ]
-ge  大于等于则为真  [ $a -ge $b ]
-lt  小于则为真  [ $a -lt $b ]
-le  小于等于则为真  [ $a -le $b ]

  实例

[root@youxi1 ~]# vim a.sh
#!/bin/bash
read -p "请输入第一个数字:" num1
read -p "请输入第二个数字:" num2
if [ $num1 -eq $num2 ] ; then
echo "第一个数字等于第二个数字"
elif [ $num1 -gt $num2 ] ; then
echo "第一个数字大于第二个数字"
elif [ $num1 -lt $num2 ] ; then
echo "第一个数字小于第二个数字"
else
echo "判断失败"
fi
[root@youxi1 ~]# sh a.sh
请输入第一个数字:1
请输入第二个数字:2
第一个数字小于第二个数字
[root@youxi1 ~]# sh a.sh
请输入第一个数字:2
请输入第二个数字:1
第一个数字大于第二个数字
[root@youxi1 ~]# sh a.sh
请输入第一个数字:1
请输入第二个数字:1
第一个数字等于第二个数字
[root@youxi1 ~]# sh a.sh
请输入第一个数字:aa
请输入第二个数字:bb
a.sh: 第 4 行:[: aa: 期待整数表达式
a.sh: 第 6 行:[: aa: 期待整数表达式
a.sh: 第 8 行:[: aa: 期待整数表达式
判断失败

(2).字符串判断

判断符号 说明 范例
= 相等则为真 [ $a = $b ]
!= 不等则为真 [ $a != $b ]
-z 字符串 字符串长度为0则为真 [ -z $a ]
-n 字符串 字符串长度不为0则为真 [ -n $n ]
字符串1 > 字符串2 字符串1大于字符串2则为真 [ str1 \> str2 ]
字符串1 < 字符串2 字符串1小于字符串2则为真 [ str1 \< str2 ]

  实例

[root@youxi1 ~]# vim a.sh
#!/bin/bash
read -p "请输入第一个字符串:" str1
read -p "请输入第二个字符串:" str2
if [ $str1 = $str2 ] ; then
echo "两个字符串相同"
elif [ -n $str1 ] && [ -n $str2 ] ; then
echo "两个字符串非空"
fi
[root@youxi1 ~]# sh a.sh
请输入第一个字符串:aaa
请输入第二个字符串:bbb
两个字符串非空

  实例2:在做字符串大小比较时,需要注意一下几点:1.字符串的顺序,大于和小于的顺序和sort排序是不一样的;2.大于号和小于号必须转义,要不然会被shell当做重定向符号;3.在test比较测试中,使用的是ASCII表,大写字母小于小写字母

[root@youxi1 ~]# vim a.sh
#!/bin/bash
read -p "请输入第一个字符串:" str1
read -p "请输入第二个字符串:" str2
if [ $str1 \> $str2 ] ; then
echo "第一个字符串大于第二个字符串"
else
echo "第一个字符串小于第二个字符串"
fi
[root@youxi1 ~]# sh a.sh  //证明比较的不是总和
请输入第一个字符串:ab
请输入第二个字符串:ba
第一个字符串小于第二个字符串
[root@youxi1 ~]# sh a.sh  //以下两个比较证明,是逐字比较
请输入第一个字符串:aa
请输入第二个字符串:ab
第一个字符串小于第二个字符串
[root@youxi1 ~]# sh a.sh
请输入第一个字符串:aa
请输入第二个字符串:ba
第一个字符串小于第二个字符串

(3).文件判断

判断符号 说明 范例
-e file 文件或目录存在则为真 [ -e file ]
-r file 文件存在且可读则为真 [ -r file ]
-w file 文件存在且可写则为真 [ -w file ]
-x file 文件存在且可执行则为真 [ -x file ]
-s file 文件存在且至少存在一个字符则为真 [ -s file ]
-d file 文件存在且为目录则为真 [ -d file ]
-f file 文件存在且为普通文件则为真 [ -f file ]
-c file 文件存在且为字符型文件则为真 [ -c file ]
-b file 文件存在且为块特殊文件则为真 [ -b file ]
file1 -nt file2 file1比file2新则为真 [ file1 -nt file2 ]
file1 -ot file2 file1比file2旧则为真 [ file1 -ot file2 ]
file1 -ef file2 file1和file2为同一文件则为真(硬链接,inode号) [ file1 -ef file2 ]

  实例

[root@youxi1 ~]# vim a.sh
#!/bin/bash
read -p "请输入第一个地址:" -r addr1
read -p "请输入第二个地址:" -r addr2
if [ $addr1 -nt $addr2 ] ; then
echo "文件1比文件2新"
elif [ $addr1 -ot $addr2 ] ; then
echo "文件1比文件2老"
fi
[root@youxi1 ~]# touch file1 file2
[root@youxi1 ~]# stat file1
文件:"file1"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:33574997 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2019-10-12 15:17:18.341481971 +0800
最近更改:2019-10-12 15:17:18.341481971 +0800
最近改动:2019-10-12 15:17:18.341481971 +0800
创建时间:-
[root@youxi1 ~]# stat file2
文件:"file2"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:33574998 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2019-10-12 15:17:18.341481971 +0800
最近更改:2019-10-12 15:17:18.341481971 +0800
最近改动:2019-10-12 15:17:18.341481971 +0800
创建时间:-
[root@youxi1 ~]# cat file2
[root@youxi1 ~]# stat file2
文件:"file2"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:33574998 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2019-10-12 15:32:06.337458140 +0800
最近更改:2019-10-12 15:17:18.341481971 +0800
最近改动:2019-10-12 15:17:18.341481971 +0800
创建时间:-
[root@youxi1 ~]# sh a.sh  //证明和访问时间atime无关
请输入第一个地址:/root/file1
请输入第二个地址:/root/file2
[root@youxi1 ~]# echo bbb >> file2
[root@youxi1 ~]# stat file2
文件:"file2"
大小:4 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:33574998 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
最近访问:2019-10-12 15:32:06.337458140 +0800
最近更改:2019-10-12 15:32:59.498600870 +0800
最近改动:2019-10-12 15:32:59.498600870 +0800
创建时间:-
[root@youxi1 ~]# sh a.sh  //应该是和更改时间mtime或改动时间ctime中的一个有关
请输入第一个地址:/root/file1
请输入第二个地址:/root/file2
文件1比文件2老

(4).特殊判断符号

判断符号 说明 范例
-a或&& 且,只有前后两个判断条件都成立才为真,-a只能用于test命令和[]中,&&只能用于[[]]中或[]之间

[ 判断条件1 ] && [ 判断条件2 ]

[ 判断条件1 -a 判断条件2 ]

[[ 判断条件1 && 判断条件2 ]]

-o或|| 或,前后两个判断条件有一个成立就为真,-o只能用于test命令和[]中,||只能用于[[]]中或[]之间

[ 判断条件1 ] || [ 判断条件2 ]

[ 判断条件1 -o 判断条件2 ]

[[ 判断条件1 || 判断条件2 ]]

! 取反 [ ! 判断条件 ]
() 改变表达式的优先级,注意加转义字符 [[ 判断条件1 && (判断条件2 && 判断条件3) ]]

(5).扩展:[[]]和[]的区别

  1)[[]]是[]的扩充。[[]]能够支持*、<、>等特殊符号,不用转义;

  2)使用-a、&&、-o、||时,有着不同的限制;

  3)[[]]可以进行算术扩展,而[]不行;

  4)[[]]能够使用正则表达式,而[]不行;

  5)[[]]可以使用通配符*、?、[list]、{list}和模糊匹配符号=~(符号前的参数包含符号后的参数则为真),而[]不行

  实例

[root@youxi1 ~]# vim a.sh
#!/bin/bash
if [[ aaaab =~ aaa ]] ; then
echo ok
else
echo false
fi
[root@youxi1 ~]# sh a.sh
ok

  

最新文章

  1. [vijos P1083] 小白逛公园
  2. max10中对DDR数据的采样转换
  3. 64位Ubuntu 13.04 安装Bochs 2.3.5
  4. linux c下mysql编程样例
  5. yum命令的使用
  6. 改变Oracle数据库连接端口
  7. 【转】 Android中退出程序的提示框
  8. weekend110(Hadoop)的 第七天笔记
  9. vue监听滚动事件,实现滚动监听
  10. Nginx上部署HTTPS
  11. Bootstrap Table急速完美搭建后台管理系统
  12. 1.Introduction 介绍
  13. HDU 1728 逃离迷宫(DFS经典题,比赛手残写废题)
  14. div放在li标签中,无法撑开li标签的问题
  15. ubuntu——caffe配置deeplab
  16. ASP.NET MVC 网站优化之压缩技术
  17. C++ 重载运算符和重载函数
  18. vue脚手架用axios请求本地数据
  19. GitHub 简单用法
  20. python 使用 matplotlib.pyplot来画柱状图和饼图

热门文章

  1. Chrome浏览器内部协议Chrome://收集
  2. Charles 4.2.1 HTTPS抓包
  3. python的tkinter,能画什么图?
  4. 弹性盒模型:flex多行多列两端对齐,列不满左对齐
  5. 10、Python迭代器与生成器(iterator、for循环、generator、yield)
  6. Flume 概述/企业案例
  7. 线程池的使用(ThreadPoolExecutor详解)
  8. sass环境搭建之node-sass,ruby
  9. 关于AndroidStudio的apk打包遇到的问题记录
  10. C/C++中double类型的比较