文章目录
引言
今天我们来讲讲shell脚本的语句 如if语句和case语句的应用
一、条件测试操作
1.test命令
- 测试表达式是否成立,若成立返回0,否则返回其他数值
两种格式:
格式1:test 条件表达式
格式2:[ 条件表达式 ] ###最少要有一个空格
2.文件测试
[ 操作符 文件或目录 ]
常用的文件测试操作符
操作符 | 含义 |
---|---|
-d | 测试是否为目录(directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
-b | 测试是否为设备文件 |
-c | 测试是否为字符设备文件 |
-s | 测试存在且文件大小为空 |
-L | 测试是否为链接文件 |
第二种格式:
3.整数值比较
[ 整数1 操作符 整数2 ]
常用的测试操作符
操作符 | 含义 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-gt | 大于(Greater Than) |
-lt | 小于(Lesser Than) |
-le | 小于或等于(Lesser or Equal) |
-ge | 大于或等于(Greater or Equal) |
[root@chen home]#: [ $(who | wc -l) -le 4 ] && echo “用户少” ##用户数是否小于等于4
用户少
[root@chen home]#: who | wc -l 2
4.字符串比较
格式1 [ 字符串1 = 字符串2 ] 或 [ 字符串1 ! = 字符串2 ]
格式2 [-z 字符串]
常用的测试操作符 | 含义 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空 |
-n | 检测是否有字符串存在 |
5.逻辑测试
格式1:[ 表达式1 ] 操作符 [ 表达式2 ]...
格式2:命令1 操作符 命令2
常用的测试操作符 | 含义 |
---|---|
-a或&& | 逻辑与,”而且“的意思 |
-o或ll | 逻辑或,”或者“的意思 |
! | 逻辑否 |
二、if语句的结构
1.单分支结构
if 条件测试操作
then 命令序列
fi
(1)列:
(2)列:
(3)列:
单个括号(【】):必须要有空格 两个字符或数字之间的比较左右必须有空格
条件判断:
test一种形式,【】中间只能使用=和!=比较字符串,如果使用< 、>需要进行转义\.
然后中间如果比较数字要用-lt 等符号,不能使用 \< 比较数字,他会当成字符串处理
两个括号【【 】】 :可用于处理逻辑命令,也可以处理字符串是否相等,且使用< 、>不用转义符
2.双分支结构
if 条件测试操作
then
命令序列 1
else
命令序列 2
fi
-c ping的次数
-i 每次多久ping一次,单位是秒
-W 反馈结果的时间,如果不通时可加快反馈时间,单位是秒
- 判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码**
read -p "请输入你要创建的用户名:" name
id $name &>/dev/null
if [ $? -eq 0 ];then
echo "该用户已存在!"
else
useradd $name
echo "123" | passwd --stdin $name &> /dev/null
echo "已创建用户$name,并设置密码"
fi
- 开启查询apache服务
#!/bin/bash
netstat -antup | grep ":80" &> /dev/null
if [ $? -eq 0 ];then
echo "Apache 服务已启动"
else
echo "Apache 服务正在启动......... "
yum install -y httpd &> /dev/null
systemctl start httpd
echo "启动完成,欢迎使用Apache服务"
fi
3.多分支结构
if 条件测试操作1 if 分数为85~100之间
then 命令序列1 then 判为优秀
elif 条件测试操作2 elif 分数为70~84之间
then命令序列2 then 判为合格
else else
命令序列3 判为不合格
fi fi
(1)需求:判断文件的类别
#!/bin/bash
name=/home
if [ -d $name ];then
echo "$name 是一个目录"
elif [ -f $name ];then
echo "$name 是一个文件"
elif [ -b $name ];then
echo "$name 是一个设备文件"
else
echo " 无法判断文件类别 "
fi
(2)罚抄案例
#!/bin/bash
read -p "请输入你的分数:" score
if [ $score -eq 100 ];then
echo "满分哦,真腻害,mua"
elif [ $score -ge 90 ] && [ $score -lt 100 ];then
echo " $score 分,请抄错题10遍"
elif [ $score -ge 70 ] && [ $score -le 89 ];then
echo " $score 分,请抄错题20遍"
elif [ $score -ge 60 -a $score -le 69 ];then
echo " $score 分,请抄错题30遍"
elif [ $score -ge 0 -a $score -lt 60 ];then
echo "$score 分,全抄 小垃圾"
else
echo "输出有误"
fi
4.if嵌套语句
判断httpd服务有没有启动
ps aux | grep httpd | grep -v grep //查询过滤httpd服务
if [ $? -ne 0 ];then //有等于0,没有不等于0
if [ "$(rpm -q httpd)"=="未安装软件包 httpd " ];then //如果未非0,表示没有该服务 ,则表示未安装
注意:这里等号两边不能加空格
echo “正在Apache服务请稍等..........”
yum -y install httpd //则下载httpd服务
systemctl start httpd //开启服务
Else //否则就是已存在安装包,只需要直接开启httpd服务
systemctl start httpd
fi
else
echo "httpd is running" //如果为0,表示该服务正在运行
Fi
等号两边不能有空格 也可以用-a来代替
三、case语句结构
case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写
case 语句主要适用于以下情况: 某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值。
case 变量值 in
模式一)
命令序列
;;
模式二)
命令序列
;;
……
*)
默认命令序列
esac
1.case语句的执行流程
首先使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1 后的命令序列,直到遇见双分号“;;”后跳转至 esac,表示结束分支;若与模式 1 不相匹配, 则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号“;;”后 跳转至 esac,表示结束分支……依此类推,若找不到任何匹配的值,则执行默认模式“*)” 后的命令序列,直到遇见 esac 后结束分支。
案例
(1)检查用户输入的字符类型
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z] | [A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "您输入的是空格 *等特殊字符"
esac
(2)编写 apache 启动服务脚本
四、总结
-
条件测试的语法
文件测试、整数值比较、字符串比较、逻辑测试
-
if条件语句的语法
单分支、双分支、多分支、嵌套
-
case多分支语句的语法