2分钟带你快速学会Shell条件判断!

大家好呀!今天简单聊一聊Shell条件判断相关的内容,如文件比较、整数及字符串之间的判断、多重条件判断等。

1、语法格式

三种语法格式:

1)test 条件表达式

test -e file:文件file存在则为真

2)[ 条件表达式 ]

[ -d /shell01/dir1 ]:目录dir1存在则为真

[ ! -d /shell01/dir1 ]:目录dir1不存在则为真

3) [[ 条件表达式 ]],支持正则

[[ -f /shell01/1.sh ]]:文件1.sh存在且为普通文件,则为真

注意中括号前后都要有空格

通过man test查看对应参数及其用法,0为真,1为假。与通常的1真0假不同。

2、条件判断相关参数

2.1 文件存在与否判断

1)常用

-e	是否存在(不管是文件还是目录,只要存在,条件就成立)
-f	是否为普通文件
-d	是否为目录
-s  判断文件是否有内容(大小),非空则为真

!表示取反,eg:-s表示非空,!-s 表示空文件。-d表示目录存在,! -d表示目录不存在。

c07a2fdc77e54967c5137f3fb99c0d7d.png

7e0e826ededc18d3f7ae53b61814a786.png

2)其他

-S	socket
-p	pipe
-c	character
-b	block
-L	软link

2.2 文件权限相关判断

-r	当前用户对其是否可读
-w	当前用户对其是否可写
-x	当前用户对其是否可执行
-u	是否有suid
-g	是否sgid
-k	是否有t位

$?:上一条命令执行后返回的状态。echo $?:输出上一条命令执行后返回的状态。

2.3 两个文件的比较判断

常见的参数有-nt、-ot、-ef,用法如下。

nt(newer than),ot(older than),ef(equal file)

# 1.比较file1是否比file2新
test file1 -nt file2
# 2.比较file1是否比file2旧	
test file1 -ot file2	
# 3.比较是否为同一个文件,或者用于判断硬链接,是否指向同一个inode
test file1 -ef file2
# 为file1文件建立链接file2(硬链接)
ln file1 file2

56b34ce1fcc286b4b7f737decf6f10f1.png

ln(link files)命令:为某一个文件在另外一个位置建立一个同步的链接。硬链接,无需重复占用磁盘空间。

硬链接相当于原文件的别名,软链接相当于原文件的快捷方式。

2.4 整数之间的判断

记住如下一些常见的英文首字母简写即可:

-eq:相等(equal)
-ne:不等(not equal)
-gt:大于(greater than)
-lt:小于(less than)
-ge:大于等于(greater equal)
-le:小于等于(less equal)

0267198a2f1ff3674849badd45671fe4.png

2.5 字符串之间的判断

-z:是否为空字符串   	字符串长度为0,就成立
-n:是否为非空字符串    	只要字符串非空,就成立

9dfe6abb398685bb8d0a21550a9f98c6.png

字符串的比较判断,尽量加上引号作为整体。

将上述简单的写法应用到具体的变量中,如下

026641165f07285803dec9634aaba151.png

双引号"" :会把引号的内容当成整体来看待,允许通过$符号引用其他变量值

2.6 多重条件判断

逻辑判断符号:

-a  和 &&  	(and 逻辑与) 		两个条件同时满足,整个大条件为真
 -o  和 ||	(or 逻辑或)		  	两个条件满足任意一个,整个大条件为真

eg:

# 1等于1 且 1不等于0,为真
[ 1 -eq 1 -a 1 -ne 0 ]				整个表达式为真
[ 1 -eq 1 ] && [ 1 -ne 0 ]			

# 1等于1 或 1不等于1,为真
[ 1 -eq 1 -o 1 -ne 1 ]				整个表达式为真
[ 1 -eq 1 ] || [ 1 -ne 1 ]

&&:前面的表达式为真,才会执行后面的内容。||:前面的表达式为假,才会执行后面的内容

既有逻辑与(&&)又有逻辑或(||),从左往右依次判断,没有优先级之分。

总结:

1); && ||都可以用来分割命令或表达式

2); 完全不考虑前面的语句是否正确执行,都会执行;号后面的内容

3)&& 需要考虑&&前面的语句的正确性,前面语句正确执行才会执行&&后的内容;反之亦然。eg:make && make install

4)|| 需要考虑||前面的语句的非正确性,前面语句执行错误才会执行||后的内容;反之亦然。

5)如果&&和||一起出现,从左往右依次看,按照以上原则

3. eg

1)判断当前的登录用户是否为管理员

[root@server ~]# [ $(id -u) -eq 0 ] && echo "the user is admin"
[root@server ~]$ [ $(id -u) -ne 0 ] && echo "the user is not admin"
[root@server ~]$ [ $(id -u) -eq 0 ] && echo "the user is admin" || echo "the user is not admin"

[root@server ~]# uid=`id -u`
[root@server ~]# test $uid -eq 0 && echo this is admin
[root@server ~]# [ $(id -u) -ne 0 ]  || echo this is admin
[root@server ~]# [ $(id -u) -eq 0 ]  && echo this is admin || echo this is not admin
[root@server ~]# su - stu1
[stu1@server ~]$ [ $(id -u) -eq 0 ]  && echo this is admin || echo this is not admin

8233348019b8558118e82e295253c2bc.png

2)类C风格的数值比较

注:在(( ))中,=表示赋值;==表示判断

((1==2));echo $? # 1
((1<2));echo $? # 0
((2>=1));echo $? # 0
((2!=1));echo $? # 0

3)字符串比较

注:双引号引起来,看作一个整体;= 和 == 在 [ 字符串 ] 比较中都表示判断

a='hello world';b=world
[ "$a" = "$b" ];echo $?
[ "$a" != "$b" ];echo $?
[ "$a" !== "$b" ];echo $? # 错误
[ "$a" == "$b" ];echo $?
test "$a" != "$b";echo $?

f4cbe5ed24731bf99d626fd7f872015b.png


好了,以上就是今天这篇文章的全部内容了。 如果你想及时看到我的文章,只需做这几个动作: 点星标、点在看(包括赞)、评论、分享 ,我就会经常出现在您的常读列表,后面更新都会提醒。感谢大家的关注和支持, 祝大家生活美满,学业有成,事业蒸蒸日上!

最后,星标设置如下:

aed6767a689e94a966b554923b326623.png


如下即设置成功!

cb65d1a761118ad05d5ad1494045241b.png

往期精彩文章推荐(点击下方蓝字即可阅读!)

往期推荐

什么是Shell的变量和数组?如何定义与使用?

最受欢迎互联网公司排行榜,速来围观!

什么是Shell?怎么编写和执行Shell脚本?

什么是DNS服务?域名解析的工作原理是什么?

7.24运维日,只有运维才懂的压力

一文带你快速理解什么是Samba服务

什么是生成式AI?什么是AIGC?

  • 12
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农后端

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值