逻辑运算符在Shell脚本编程中的应用

简介:

原文发表于2017年第11期《网络安全与信息化》,转发到博客。

在Linux系统运维工作中,Shell脚本编程是运维人员应必须掌握的一项基本技能,在大多数的Shell脚本中都需要进行条件测试操作,从而使得脚本可以有选择地执行任务。本文将介绍如何通过逻辑运算符来同时测试多个条件,以及如何利用逻辑运算符来连接多条命令,从而实现简单高效的选择判断操作。

1. 逻辑运算符的基本用法

通过逻辑运算符可以同时测试多个条件,根据这些条件是否同时成立或者只要有其中一个条件成立等情况,来决定采取何种操作。逻辑运算符有:
 &&:逻辑与,表示前后两个条件都成立时整个测试结果才为真,否则结果为假。
 ||:逻辑或,表示前后两个条件至少有一个成立时整个测试结果即为真,否则结果为假。
 !:逻辑非,表示当指定的条件不成立时,整个测试结果为真。
逻辑运算符的基本用法非常简单,比如判断文件“/etc/passwd”和“/etc/shadow”是否存在,要求两个条件同时满足,则可以使用下面的表达式,并通过查看“$?”的值来获知测试结果,值为0表示条件成立,值为非0表示条件不成立。
[root@Server ~]# [ -e /etc/passwd ] && [ -e /etc/shadow ]
[root@Server ~]# echo $?
0
再比如要测试当前用户对文件“/etc/passwd”和“/etc/shadow”是否具有写入权限,只要满足其中一个条件即可,可以使用下面的表达式。
[root@Server ~]# [ -w /etc/passwd ] || [ -w /etc/shadow ]
[root@Server ~]# echo $?
0

2. 逻辑运算符连接多条命令

除了同时测试多个条件之外,逻辑运算符“&&”和“||”通常也用于间隔不同的命令操作,这也是本文要重点介绍的内容。比如表达式“command1 && command2”,在这个表达式中,如果command1的测试结果为假,那么command2就不会再执行。因为对于逻辑与操作,只要有一个测试条件不成立,那么整个测试结果也就必然为假,因而此时就无需再去判断command2是否成立。反之,如果command1的测试结果为真,则command2就必须执行。
如果使用逻辑运算符“||”来连接两个命令,情况又是不同。比如表达式“command1 || command2”,在这个表达式中,如果command1的测试结果为真,则command2不再执行。因为对于逻辑或操作,只要有一个测试条件成立,那么整个测试结果就必然为真,因而此时也无需再去判断command2是否为真。反之,如果command1的测试结果为假,则command2必须执行。
因而,对于“&&”和“||”的特点可以总结如下:
 &&,当前面的命令执行成功后才会执行后面的命令;
 ||,当前面的命令执行失败后才会执行后面的命令。

3. 实例演示

下面是几个具体的应用实例。
例:判断当前的用户是否是teacher,若不是则提示“Not teacher”。
[root@localhost ~]# echo $USER
root
[root@localhost ~]# [ $USER = "teacher" ] || echo "Not teacher"
Not teacher
例:判断当前的用户是否是teacher,若是则提示“Good Morning teacher”,若不是则提示“Not teacher”。
[root@localhost ~]# echo $USER
root
[root@localhost ~]# [ $USER = "teacher" ] && echo "Good morning teacher" || echo "not teacher"
not teacher
同样是上面这个操作,我们切换到teacher用户再来试一下。
[root@localhost ~]# useradd teacher
[root@localhost ~]# su - teacher
[teacher@localhost ~]$ [ $USER = "teacher" ] && echo "Good morning teacher" || echo "not teacher"
Good morning teacher
在这三个逻辑运算符中,“&&”尤为常用。比如要查看一个条件表达式的测试结果,如果通过查看预定义变量“$?”的值来进行判断,操作繁琐,输出结果也不是很直观。为了更便于查看条件测试操作的结果,通常都是将“&&”和echo命令一起使用,当条件成立时直接输出“yes”。
例:判断文件“/dev/cdrom”是否存在,如果存在,则直接输出yes。
[root@localhost ~]# [ -e /dev/cdrom ] && echo "yes"
yes
例:只要“/etc/rc.d/rc.local”或者“/etc/init.d/rc.local”中有一个是文件,则显示“YES”,否则无任何输出。
[root@localhost ~]# [ -f /etc/rc.d/rc.local ] || [ -f /etc/init.d/rc.local ] && echo "yes"
例:测试“/etc/profile”文件是否有可执行权限,若确实没有可执行权限,则提示“No x mode”的信息。
[root@localhost ~]# [ ! -x "etc/profile" ] && echo "No x mode"
No x mode
例:若当前用户是root且使用的shell程序是“/bin/bash”,则显示“yes”,否则无任何输出。
[root@localhost ~]# [ $USER = "root" ] && [ $SHELL = "/bin/bash" ] && echo "yes"
Yes
下面来编写一个具体的脚本,要实现的功能是删除“/root/test”目录中的test-1、test-2……test-10文件,但是test-3和test-7除外。
在脚本中用到了for循环和continue语句,continue语句在for循环中用于暂停本次操作,跳转至循环语句的顶部重新测试条件,本次执行过程中continue后的命令序列将被忽略。
[root@localhost ~]# ls /root/test
test-1 test-10 test-2 test-3 test-4 test-5 test-6 test-7 test-8 test-9
[root@localhost ~]# vim del.sh
#!/bin/bash
for i in $(seq 10)
do
#遇到需要保留的文件时跳过而不删除
[ $i -eq 3 ] || [ $i -eq 7 ] && continue 
rm -f /root/test/test-$i
done
[root@localhost ~]# chmod u+x del.sh 
[root@localhost ~]# ./del.sh 
[root@localhost ~]# ls /root/test
test-3 test-7 
因而,灵活运用 “&&”和“||”这两个逻辑运算符,在很多时候就可以代替复杂的if语句,从而使得我们的Shell脚本更加简捷高效。

本文转自 yttitan 51CTO博客,原文链接:http://blog.51cto.com/yttitan/2054145


相关文章
|
1天前
|
Shell Linux
【linux】Shell脚本中basename和dirname的详细用法教程
本文详细介绍了Linux Shell脚本中 `basename`和 `dirname`命令的用法,包括去除路径信息、去除后缀、批量处理文件名和路径等。同时,通过文件备份和日志文件分离的实践应用,展示了这两个命令在实际脚本中的应用场景。希望本文能帮助您更好地理解和应用 `basename`和 `dirname`命令,提高Shell脚本编写的效率和灵活性。
49 32
|
4月前
|
Shell
一个用于添加/删除定时任务的shell脚本
一个用于添加/删除定时任务的shell脚本
150 1
|
3月前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
101 2
6种方法打造出色的Shell脚本
|
3月前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
122 1
|
3月前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
120 2
|
4月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
84 6
|
3月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
4月前
|
Shell
Shell编程(下)
Shell编程(下)
123 1
|
4月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
65 1
|
4月前
|
Shell Linux 开发工具