【Linux】Shell 脚本编程——条件测试与比较
ℹ️大家好,我是练小杰,周末愉快,好久不见,今天接着更新SHELL编程代码相关内容!!!
本文是 Linux shell 脚本编程中条件测试和比较方面内容,后续将添加更多相关知识噢,谢谢各位的支持🙏前情回顾: 【Shell 命令从零开始】
Linux专栏:🔝 【Linux零基础开始】【Shell 脚本编程】 【Linux文件系统 】主页:👉【练小杰的CSDN】
“我们的未来,由我们自己说了算~~”
- 主页:👉【[练小杰的CSDN](https://blog.csdn.net/weixin_55767624?spm=1011.2415.3001.5343)】
- “我们的未来,由我们自己说了算~~”
- shell脚本的条件测试
- test <测试表达式>
- [ ](中括号)条件测试语法
- 文件测试表达式
- 测试选项详解
- 字符串测试表达式
- 判断字符串是否相等
- 整数二元比较操作符
- 逻辑操作符
- 逻辑与: -a (&&)
- 逻辑或:-o (||)
- 逻辑非:!
shell脚本的条件测试
- 条件测试常用的语法:
语法1:
test <测试表达式>
语法2:[ <测试表达式> ]
语法3:[[ <测试表达式> ]]
语法4:(( <测试表达式>))
⚠️语法1中的
test
命令和语法2中的[ ]
是一样的。语法3中的[[]]
是扩展test命令,语法4中的(())
常用于计算,我一般使用的是语法2,更方便。
test <测试表达式>
- 利用
test
命令进行条件测试表达的方法,test
命令和“<测试表达式>
”之间至少有一个空格- 关于
test
测试表达式的更多使用选项,执行man test
查看帮助文档。- test命令测试功能强大,但是和
[ ]、[[ ]]
的功能有所重合,因此,在实际工作中选择一种自己喜欢的语法就好。
- 判断该文件是否存在于当前目录
[root@localhost lxj]# ls
lian.sh lxj.sh
[root@localhost lxj]# test -f lian.sh && echo "true" || echo "false" // 输出结果ture
如果
lian.sh
文件存在,则输出true,否则(||)输出false
。这里的&&
表示并且的意思。-f
参数用于测试文件是否为普通文件,test命令若执行成功(为真),则执行&&后面的命令,而||后面的命令则是test命令执行失败之后(为假)所执行的命令。
- 判断文件是否有可执行权限
x
echo $(test -x /root/lxj/lian.sh )echo $( test -x /root/lxj/lian.sh && echo "ture" || echo "false")
//输出结果为false
第一条命令只使用test 命令是没有输出结果的,
test -x
命令在执行时只返回退出状态码。但是$()
命令是有标准输出的,不是退出状态码。
因此,在test
命令后加上echo "ture" || echo "false"
用于判断文件权限。
[ ](中括号)条件测试语法
⚠️ 中括号内部的两端要有空格,
[ ]
和test
等价,即test的所有判断选项都可直接在[ ]里使用。
- 基础语法格式为:
[ <测试表达式> ]
- 判断该文件是否存在于当前目录,另一种写法
[ -f lian.sh ])
[root@localhost lxj]# [ -f lian.sh ] && echo "true" || echo "false"
true
[root@localhost lxj]# ls
lian.sh lxj.sh
- 判断该文件是否是目录
[root@localhost lxj]# [ -d lian.sh ] && echo "true" || echo "false"
false
[root@localhost lxj]# ll
总用量 8
-rw-r--r--. 1 root root 57 6月 11 16:13 lian.sh
-rw-r--r-- 1 root root 41 6月 25 09:41 lxj.sh
可以看到文件lian.sh 是普通文件,不是目录文件,返回输出结果false
文件测试表达式
shell编程中要处理一个对象,一般是先对对象进行测试,只有在确定它符合要求时,才应进行操作处理,这样做的好处就是避免程序出错及无谓的系统资源消耗,这个需要测试的对象可以是文件、字符串、数字等。
- 判断文件
/root/lxj
是否是目录文件
[root@localhost ~]# test -d /root/lxj && echo "true" || echo "false"
true
[root@localhost ~]# [ -d /root/lxj ] && echo "true" || echo "false"
true
通过输出结果,可以发现,lxj是目录/root 下的一个目录文件,权限为
drwxr-xr-x.
测试选项详解
- b<文件>
block:如果文件为一个块特殊文件,则为真;
-c<文件>
character:如果文件为一个字符特殊文件,则为真;
-S<文件>
socker:如果文件为一个套接字特殊文件,则为真;
-p<文件>
pipeline:如果文件为一个命名管道,则为真;
-f<文件>
file:如果文件为一个普通文件,则为真;
-d<文件>
directory:如果文件为一个目录,则为真;
-e<文件>
exist:如果文件存在,则为真;
-G<文件>
group:如果文件存在且归该组所有,则为真;
-O<文件>
own:如果文件存在并且归该用户所有,则为真;
-g<文件>
SGID:如果设置了文件的SGID位,则为真;
-u<文件>
SUID:如果设置了文件的SUID位,则为真;
-k<文件>
Sticky bit:如果设置了文件的粘着位,则为真;
-r<文件>
read:如果文件可读,则为真;
-w<文件>
write:如果文件可写,则为真;
-x<文件>
execute:如果文件可执行,则为真。
-s<文件>
size:如果文件的长度不为零,则为真;
字符串测试表达式
字符串测试操作符的作用包括:比较两个字符串是否相同、测试字符串的长度是否为0、字符串是否为NULL等。
判断字符串是否相等
[root@localhost ~]# str1="I like lxj"
[root@localhost ~]# str2="I hate lian"
[root@localhost ~]# test str1 == str2 && echo "true" || echo "false"
false
[root@localhost ~]# [ str1 == str2 ] && echo "true" || echo "false"
false
⚠️ 注意:中括号内的
[ ]
判断符号== 前后必须要用空格隔开,否则会出现错误❎判断。
- 例如,下面的
==
前后没有空格,导致字符串判断结果错误。
[root@localhost ~]# test str1==str2 && echo "true" || echo "false"
true
整数二元比较操作符
- “
=
”和“!=
”也可在[ ]
做比较使用,但在[ ]
中使用包含“>”和“<”的符号时,需要用反斜杠“\”进行转义,有时不转义虽然语法不会报错,但是结果可能会不对。- 也可以在[[ ]]中使用包含“
-gt
”和“-lt
”的符号,但是不建议这样使用。- 比较符号两端也要有空格。
- 判断数的大小
[root@localhost ~]# [ 12 -gt 8 ] && echo "true" || echo "false"
true
逻辑操作符
逻辑与: -a (&&)
格式:表达式1 -a 表达式2
结果:表达式1 和表达式2 都为真,才返回真,否则返回假。
- 判断文件有可执行权限且是目录文件,都为真返回1,否则返回0
[root@localhost ~]# [ -x /root/lxj -a -d /root/lxj ] && echo "1" || echo "0"
1
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1684 6月 11 15:35 anaconda-ks.cfg
-rw-r--r--. 1 root root 1715 6月 11 15:39 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 35 6月 25 09:41 lxj
/root/lxj
是可执行且是文件, 结果返回1
逻辑或:-o (||)
格式:表达式1 -o 表达式2
结果:表达式1 和 表达式2中,有一个条件为真,即返回真,否则返回假。
- 判断文件 是可执行或者 文件是目录文件时, 返回1,否则返回0
[root@localhost ~]# [ -x /root/lxj -o -d /root/lxj ] && echo "1" || echo "0"
1
[root@localhost ~]# [ -x /root/lxj -a -d /root/lxj ] && echo "1" || echo "0"
1
- 利用
||
表示或运算符时,要用[[ ]]
或者(( ))
,否则会报错
[root@localhost ~]# [ -x /root/lxj || -d /root/lxj ] && echo "1" || echo "0"
bash: [: 缺少 `]'
bash: -d: 未找到命令...
0[root@localhost ~]# [[ -x /root/lxj || -d /root/lxj ]] && echo "1" || echo "0"
1
逻辑非:!
格式:
!条件语句
结果:返回条件测试条件结果的相反值
- 判断测试语句的相反数值
[root@localhost ~]# ! [[ -x /root/lxj ]] && echo "1" || echo "0"
0
⚠️ !与中括号之间要有空格,否则命令报错
今天的SHELL 脚本的相关内容到这里就结束了,下次再见啦👋
ℹ️了解更多,主页【练小杰的CSDN】⚠️若博客里的内容有问题,欢迎指正,我会及时修改!!! 下周同一时间再见,各位伙伴们🚴🏻♀️~~