逻辑运算符在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


相关文章
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
570 10
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
567 2
|
9月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
338 60
|
12月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
6月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。
|
8月前
|
Web App开发 缓存 安全
Linux一键清理系统垃圾:释放30GB空间的Shell脚本实战​
这篇博客介绍了一个实用的Linux系统盘清理脚本,主要功能包括: 安全权限检查和旧内核清理,保留当前使用内核 7天以上日志文件清理和系统日志压缩 浏览器缓存(Chrome/Firefox)、APT缓存、临时文件清理 智能清理Snap旧版本和Docker无用数据 提供磁盘空间使用前后对比和大文件查找功能 脚本采用交互式设计确保安全性,适合定期维护开发环境、服务器和个人电脑。文章详细解析了脚本的关键功能代码,并给出了使用建议。完整脚本已开源,用户可根据需求自定义调整清理策略。
964 1
|
10月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
391 17
|
11月前
|
Linux Shell
在Linux、CentOS7中设置shell脚本开机自启动服务
以上就是在CentOS 7中设置shell脚本开机自启动服务的全部步骤。希望这个指南能帮助你更好地管理你的Linux系统。
1332 25
|
10月前
|
Linux Shell
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
Centos或Linux编写一键式Shell脚本删除用户、组指导手册
299 4
|
10月前
|
Linux Shell 数据安全/隐私保护
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
Centos或Linux编写一键式Shell脚本创建用户、组、目录分配权限指导手册
547 3