周顺的技术博客

  • 1. 基本语法
  • 2. 文件存在与否判断(重点)
  • 3. 文件权限判断
  • 4. 两个文件新旧比较
  • 5. 大小比较符号(重点)
  • 6. 字符串之间的判断(重点)
  • 7. 逻辑判断符号(重点)
  • 首页
  • 榜上有名
  • 文章归档
  • 读者排行
  • 豆瓣书影
  • 友情链接
  • DevOps (4)
  • Docker (4)
  • k8s (9)
  • linux (11)
  • Mysql (9)
  • Python (2)
  • Redis (1)
  • Shell (6)
  • 主题 (0)
  • 未分类 (0)

Shell中的判断语句

  • xiaoteng
  • 2024-05-11
  • 0

判断语句:解决业务逻辑中的判断问题

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 或 || :逻辑或,两个条件满足任意一个,整个大条件为真

条件表达式 && 条件为真执行此语句 || 条件为假则执行此语句

© 2026 周顺的技术博客
Theme by Wing
  • {{ item.name }}
  • {{ item.name }}