Shell编程之条件语句
文章目录
引言:本片内容主要介绍了各种文件测试以及if语句的部分知识,我们需要了解到一个文件存在与否,是什么样的文件,对一个文件进行判断用什么办法,多个条件对比的方法,在if语句当中应如何应用
一、条件测试
1.文件测试
要使Shell脚本程序具备一定的“智能”,面临的第一个问题就是如何区分不同的情况以确定执行何种操作,例如当磁盘使用率超过95%时,发送告警信息;当备份目录不存在时,能够自动创建;当源码编译程序时,若配置失败不在继续安装
Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,当返回值为0时表示成功,否(非0值)表示失败或出现异常。使用专门的测试工具—test命令,可以对特定文件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立)
test命令:测试表达式是否成立,若成立返回0,否则返回其他数值
格式1: test 条件表达式
格式1: [ 条件表达式 ]
-d :测试是否为目录 (Directory)
-e :测试目录或文件是否存在(Exist)
-f :测试是否为文件(File)
-r :测试当前用户是否有权限读取(read)
-w :测试当前用户是否有权限写入(write)
-b :测是否为设备文件
-c :测试是否为字符设备文件
-s :测试存在且文件大小为空
-L :测试是否为链接文件
**例:**执行条件测试操作以后,通过预定义变量
?
可
以
获
得
测
试
命
令
的
返
回
状
态
值
,
从
而
判
断
该
条
件
是
否
成
立
,
例
如
:
执
行
以
下
操
作
可
测
试
文
件
或
目
录
是
否
存
在
,
如
果
返
回
值
?可以获得测试命令的返回状态值,从而判断该条件是否成立,例如:执行以下操作可测试文件或目录是否存在,如果返回值
?可以获得测试命令的返回状态值,从而判断该条件是否成立,例如:执行以下操作可测试文件或目录是否存在,如果返回值?为0,表示存在此目录,否则表示不存在或者虽然存在但不是目录
2.整数值比较
常用的测试操作符
-eq:等于(Equal)
-ne:不等于(Not Equal)
-gt:大于(Greater Than)
-lt:小于(Lesser Than)
-le:小于或等于(Lesser or Equal)
-ge:大于或等于(Greater or Equal)
shell脚本中需要用“==”否则不成立
用户登录告警判断终端进程用户多少,如果小于4个,输出信息“当前用户太少”
**例2:磁盘容量不足告警
free 查看输出内存信息
3.字符串比较
格式1:[ 字符串1 = 字符串2 ]
[字符串1 != 字符串2 ]
格式2:[ -z 字符串 ]
常用的测试操作符:
- =:字符串内容相同
- !=:字符串内容不同,!号表示相反的意思
- -z:字符串内容为空
[ $LANG != zh_CN.UTF-8 ] && echo “当前系统语言为中” || echo “当前系统语言是中文”
注:&&逻辑且;而且的意思
4.逻辑测试
格式1:[ 表达式1] 操作符 [ 表达式2 ]……
格式2:命令1 操作符 命令2
常用的测似乎操作符:
- -a或&&:逻辑与,”而且“的意思
- -o或||:逻辑或,"或者"的意思
- !:逻辑否
在这里插入图片描述
二、if语句的结构
单个括号"[]":必须要有空格,两个字符或数字之间的比较,左右也必须有空格
条件判断:text 的一种形式,[]中间只能使用 = 和 ! 比较,如果使用 <、> 需要进行转义;还有中间如果使用比较数字要用 -lt/lt 等符号,但是不能使用<来比较数字,他会当初字符串处理
两个括号"[[]]":可以用于处理逻辑命令,也可以处理字符串是否相等,且可以使用<、>不需要进行转义
1.单分支if语句
实际上使用"&&“和”||"逻辑测试已经可以完成简单的判断并执行和相应的操作,但是当需要选择执行的命令语句较多时,这种方式将使执行代码显得很复杂,不好理解,而使用专用的if条件语句,可以更好的整理脚本结构,使得层次分明,清晰易懂
单分支if语句:对于单分支的选择结构,只有在"条件成立"时才会执行相应的代码,否则不执行任何操作
判断目录是否存在,不存在就自动下载:
判断有没有/data目录,没有就下载
2.if语句双分支结构
if 条件测试操作
then
命令序列 1
else
命令序列2
fi
测试192.168.206.190能否Ping通
**例2:**判断输入的用户是否存在,存在就会提示已存在,不存在自动创建该用户并设置密码
**例3:**开启查询apache服务
3.多分支结构
if 条件测试操作
then
命令序列1
elif
条件测试操作2
then
命令序列2
else
命令序列3
fi
多种条件测试
例1判断文件类别:,如果输入方法变量内容不是什么文件,会告诉你无法判断文件类别
例2输入成绩得知评价结果
4.嵌套if语句
赋予脚本权限,安装htppd,
查看httpd是否运行
三、case多分支语句结构
1.case多分支语句概述
case语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种脚本,需要case语句编写;
**case适用场景:**当某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列,这种情况与多分支的if语句非常相似,只不过if语句需要判断多个不同的条件,而case语句只是判断一个变量的不同取值
**case注意事项:*case行尾必须为单词"in",每一模式必须以右括号“)”结束,双份好";;“表示命令序列的结束。模式字符串中,可以用方括号表示一个连续的范围,如”[0-9]“,还可以用竖杠符号”|“表示或,如"A|B”,最后的" ) “表示默认模式,其中的”*"相当于通配符
case语句的执行流程:,首先使用"变量值"与模式1进行比较,若取值相同则执行模式1后的命令序列,直到遇见双分号";;“后跳转至esac,表示结束分支;若与模式1不匹配,继续与模式2进行比较,若取值相同则执行模式2后的命令序列,直到遇见双分号”;;“跳转到esac,表示结束分支……依次类推,如找不到任何匹配的值,执行默认模式”* )"后的命令序列,直到遇见esac后结束分支。
例1:判断字符类型
输入字符,判断出输入的是哪种字符类型
例2:编写Apache开启关闭服务
例3:输入成绩简单方法
总结
结合上述我编辑的内容,对于条件测试的语法中,文件测试、整数值比较、字符串比较以及逻辑测试我都做了一些简单的案列,这都是为了if语句的铺垫,想要写好一个脚本就必须把这些基础理清思路,
后半部分我从生产环境中极大简化了一部分,做出几个案例可以了解到单分支、双分支、多分支、嵌套语句的语法,该怎么使用,以及case多分支语句的语法,这也是会经常使用到的
**1.条件测试的语法:**文件测试、整数值比较、字符串比较、逻辑测试
**2.if条件语句的语法:**单分支、双分支、多分支、嵌套
3.case多分支语句的语法.