判断语句:解决业务逻辑中的判断问题
1. 基本语法
语法格式一:
test 条件表达式
语法格式二:
[ 条件表达式 ],注意:判断语句两边必须保留一个空格
语法格式三:
[[ 条件表达式 ]] 支持正则表达式,注意:判断语句两边必须保留一个空格
强调:以上判断语句,如果判断为真(返回为0),反之则返回(非0)
2. 文件存在与否判断(重点)
面试:你熟悉Shell脚本,如何判断一个文件是否存在?
答:-e(exist判断是否存在)
-e exist,是否存在 不管是文件还是目录,只要存在,条件就成立-f file,是否为普通文件-d directory,是否为目录
--------------------------------------------------------------------------------------------------------------------
-S socket,是否为套接字文件 => MySQL => mysql.sock这个文件就是套接字(客户端连接服务器端桥梁)
-c character,是否为字符设备
-b block,是否为块设备文件,如/dev/sda
-L link,是否为软链接文件(快捷方式)
记住:-e、-f、-d、-L
character是指直接与硬件设备进行交互的文件,按字符流的方式读写数据。字符设备通常用于访问串行端口、键盘、终端等设备,如/dev/tty终端设备,/dev/null空设备
三种语法格式:
test -e file 只要文件存在条件为真
[ -d /shell01/dir1 ] 判断目录是否存在,存在条件为真
[ ! -d /shell01/dir1 ] 判断目录是否存在,不存在条件为真
[[ -f /shell01/1.sh ]] 判断文件是否存在,并且是一个普通的文件
强调判断过程中,如果前面添加了一个!代表取反
-s 判断文件是否有内容(大小),非空文件条件满足
说明:-s表示非空,! -s 表示空文件
说明:1.sh文件里有内容的
[root@itheima]# test -s 1.sh
[root@itheima]# echo $?
0
[root@itheima]# touch aaa
[root@itheima]# cat aaa
[root@itheima]# test -s aaa
[root@itheima]# echo $?
1
[root@itheima]# test ! -s aaa
[root@itheima]# echo $?
0
[root@itheima]# test ! -s 1.sh
[root@itheima]# echo $?
1
3. 文件权限判断
itheima/readme.txt
-r 当前用户对其是否可读
-w 当前用户对其是否可写
-x 当前用户对其是否可执行
案例:
判断是否有读权限
test -r /etc/passwd
判断是否有写权限
test -w /tmp/testfile
判断是否有执行权限
test -x /bin/bash
4. 两个文件新旧比较
新旧:指的是文件创建时间
注意:新旧比较必须实用特定的字符,不能直接使用大于号或小于号
file1 -nt file2 比较file1是否比file2新
file1 -ot file2 比较file1是否比file2旧
file1 -ef file2 比较是否为同一个文件,或者用于判断硬连接,是否指向同一个inode
-nt:new than
-ot:old than
-ef:equal file
案例演示:
test file1 -nt file2
[ file1 -ot file2 ]
小结:
通过新旧比较,了解两个文件的创建信息
5. 大小比较符号(重点)
说明:默认情况下,Shell脚本中,一般不能直接使用如>、<、>=、<=、=等于等符号的,为了解决以上问题,引入了一组符号:
在 Shell 中,-eq、-ne、-gt、-lt、-ge 和 -le 用于数值比较。它们常用于测试两个数字是否相等、不等、大小关系等。下面是这些操作符的详细解释和一些实际案例。
-eq (equal)相等-ne (not euqal)不等-gt (greater than)大于-lt (litter than)小于-ge (greater equal)大于等于-le (litter equal)小于等于
案例:
a=5
b=5
test $a -eq $b
案例:
a=8
b=7
test $a -ge $b
小结:
由于在Shell脚本中,很多数学符号都有特殊含义,如果要进行日常比较,只能使用字母形式的比较符号!
6. 字符串之间的判断(重点)
-z (zero)是否为空字符串 字符串长度为0,就成立
-n (not zero)是否为非空字符串 只要字符串非空,就是成立
string1 = string2 是否相等
string1 != string2 不等
案例演示:
[root@itheima ~]# AAA=hello
[root@itheima ~]# BBB=world
[root@itheima ~]# test -z $AAA
[root@itheima ~]# echo $?
1
[root@itheima ~]# test -n $AAA
[root@itheima ~]# echo $?
0
[root@itheima ~]# [ $AAA = $BBB ]
[root@itheima ~]# echo $?
1
[root@itheima ~]# [ $AAA != $BBB ]
[root@itheima ~]# echo $?
0
小结:
-z、-n、=、!=,主要用于字符串判断操作
疑问:-eq 与 = 有何区别?
答:如果是数字比较,只能使用-eq;如果是字符串比较,可以使用=进行比较
7. 逻辑判断符号(重点)
逻辑判断符号:逻辑与、逻辑或符号
逻辑与:-a 或 &&,and缩写
逻辑或:-o 或 ||,or缩写
逻辑判断符号:
[ 表达式1 -a 表达式2 ],两个条件同时满足,整个大条件为真
[ 表达式1 ] && [ 表达式2 ],两个条件同时满足,整个大条件为真
故事:女孩子,自身条件比较好,要求男方必须要有车 且 有房,牵手成功
[ 有车 -a 有房 ]
[ 表达式1 -o 表达式2 ],两个条件满足任意一个,整个大条件为真
[ 表达式1 ] || [ 表达式2 ],两个条件满足任意一个,整个大条件为真
故事:女孩子,自身条件一般,要求男方必须要有车 或 有房,牵手成功
[ 有车 -o 有房 ]
-a 和 && (and 逻辑与) 两个条件同时满足,整个大条件为真
-o 和 || (or 逻辑或) 两个条件满足任意一个,整个大条件为真
生产应用:代替if...else语句(二选一结构,if后面跟条件,如果条件是真的 ,就执行if代码,反之就执行else代码)
age=19
if [ $age -ge 18 ]; then
如果条件成立,就执行下方代码
echo "已成年,可以上网"
else
如果条件不成立,就执行else下方代码
echo "未成年,不可以上网"
fi
简化
条件表达式 && 如果条件成立,执行此内容 || 如果条件不成立,执行此内容
age=19
[ $age -ge 18 ] && echo "已成年,可以上网" || echo "未成年,不可以上网"
执行原理:
第一步:把条件表达式 && 如果条件成立,执行此内容当做一个整体,先判断
如 [ 1 -eq 2 ] && echo true,如果左边是真的,必须要判断右边(执行右边),因为中间&&,必须两边同时为真,同时执行;如果左边是假的,则右边完全不需要执行了,因为逻辑与,必须两边同时成立,只要有一边为假,最终结果肯定是假的。
第二步:把第一步得到的结果 与 后面的条件组合
true || echo false,由于左边是真的,中间逻辑符号是||,则右边肯定不会执行
false || echo false,由于左边是假的,中间逻辑符号是||,要想获取最终结果必须执行右边表达式,才能获取最终结果
案例演示:
[ 1 -eq 1 -a 1 -ne 0 ] 整个表达式为真
[ 1 -eq 1 ] && [ 1 -ne 0 ]
[ 1 -eq 1 -o 1 -ne 1 ] 整个表达式为真
[ 1 -eq 1 ] || [ 1 -ne 1 ]
[root@itheima ~]# [ 1 -eq 0 ] && echo true || echo false
false
[root@ itheima ~]# [ 1 -eq 1 ] && echo true || echo false
true
&&:前面的表达式为真
||:前面的表达式为假
小结:
-a 或 &&:逻辑与,两个条件同时满足,整个大条件为真
-o 或 || :逻辑或,两个条件满足任意一个,整个大条件为真
条件表达式 && 条件为真执行此语句 || 条件为假则执行此语句