这里写目录标题
一. 条件测试
1.1 test命令
- 测试表达式是否成立,若成立返回0,否则返回其他值
格式1:test+ 条件表达式(判断是否成立的条件)
格式2:【 条件表达式 】 注意:【空格
表达式空格
】
1.2 文件测试
格式:【 操作符 文件或目录 】
常用操作符 | 说明 |
---|---|
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
-b | 测试是否为设备文件 |
-c | 测试是否为字符设备 |
-s | 测试存在且文件大小为空 |
-L | 测试是否为链接文件 |
经典案例:
1.3 整数值比较
格式:【 整数1 操作符 整数2 】
常用操作符 | 说明 |
---|---|
-eq | 等于(Equal) |
-ne | 不等于(Not Equal) |
-lt | 小于(Leser Than) |
-gt | 大于(Greater Than) |
-le | 第一个数小于或等于第二个数(Lesser or Equal) |
-ge | 第一个数大于或等于第二个数(Greater or Equal) |
经典案例:
1.4 字符串比较
格式1:【 字符串1 = 字符串2 】
【 字符串1 != 字符串2 】
格式2:【 -z 字符串】
常用操作符 | 说明 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,!号表示相反的意思 |
-z | 字符串内容为空 |
-n | 检查是否有字符串存在 |
1.5 逻辑测试
格式一:【 表达式1 】 操作符 【 表达式2 】
格式二: 命令1 操作符 命令2
常用操作符 | 说明 |
---|---|
-a或&& | 逻辑与,而且的意思 |
-o或 | ▕▕ 逻辑或,或者的意思 |
! | 逻辑否 |
经典案例:
二、if条件语句结构
2.1 if单分支结构
实际上使用“&&”和“||”
逻辑测试已经可以完成简单的判断并执行相应的操作,但是当需要选择执行的命令语句较多时,这种方式将使执行代码显得很复杂,不好理解。而使用专用的 if 条件语句,可以更好地整理脚本结构,使得层次分明, 清晰易懂

单分支 if 语句:对于单分支的选择结构,只有在“条件成立”时才会执行相应的代码,否则不执行任何操作。
语法:
1)
if 【 条件测试操作 】
then
命令序列
fi #注意后面有个结尾,开头结尾要凑成一对否则会报语法错误
2)
if 【 条件测试操作 】;then
命令序列
fi
经典案例:
1.
2.
3.
4.
注意:
单个括号(【】):必须要有空格 两个字符或数字之间的比较左右必须有空格
条件判断:
test一种形式,【】中间只能使用=和!=比较字符串,如果使用< 、>需要进行转义\.
然后中间如果比较数字要用-lt 等符号,不能使用 \< 比较数字,他会当成字符串处理
两个括号【【 】】 :可用于处理逻辑命令,也可以处理字符串是否相等,且使用< 、>不用转义符
2.2 if双分支结构
双分支 if 语句只是在单分支的基础上针对“条件不成立”的情况执行另一种操作,而不是 “坐视不管”地不执行任何操作
语法:
if 条件
then
指令集
else
指令集
fi
经典案例:
1.检测网段是否存活
2.
#!/bin/bash
ip=192.168.10.12
ping -c 2 -i 0.2 -W 3 $ip &> /dev/null
if [ $? -eq 0 ];then
echo "$ip is up "
else
echo "$ip is down"
fi
-c ping的次数
-i 每次多久ping一次,单位是秒
-W 反馈结果的时间,如果不通时可加快反馈时间,单位是秒
3.判断输入的用户名是否存在,存在提示已存在,不存在则创建用户并设置密码
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
4.开启查询apache服务
#!/bin/bash
netstat -natup | grep ":80" &> /dev/null //查询服务检索端口 有没有80端口的服务存在,把输出的信息放到黑洞里
if [ $? -eq 0 ];then
echo "apache服务已经运行!"
else
echo "启动httpd服务"
yum install -y httpd &> /dev/null
systemctl start httpd
echo "启动完成,欢迎使用Apaceh服务!"
fi
2.3 if多分支结构
多分支结构:
与单分支、双分支 if 语句相比,多分支 if 语句的结构能够根据多个互斥的条件分别执行不同的操作
if 条件
then
指令
elif 条件
then
指令
else
指令
fi
经典案列:
1.需求:判断文件的类别
[root@localhost home]# vim dome6.sh
#!/bin/bash
name=/home
if [ -d $name ] && [ -r $name ];then
echo "$name 是一个目录并且具有可读权限"
elif [ -f $name ];then
echo "$name 是一个文件"
elif [ -b $name ];then
echo "$name 是一个设备文件"
else
echo "无法判断文件类别"
fi
2.根据输入的考试分数不同来区分优秀、合格、不合格三挡
#!/bin/bash
read -p "请输入您的分数(0-100): " GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]
then
echo "$GRADE 分,优秀!"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]
then
echo "$GRADE 分,合格!"
else
echo "$GRADE 分,不合格!"
fi
3.罚抄案例
#!/bin/bash
read -p "请输入你的分数: " score
if [ $score -eq 100 ];then
echo "秀儿!"
elif [ $score -ge 90 ] && [ $score -lt 100 ]
then
echo "$score 分,抄10遍!"
elif [ $score -ge 70 -a $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 分,全抄30遍 !"
else
echo "输入有误!"
fi
当输入非法字符时,会显示报错!
此时你一定要注意要进行对脚本的完善,让他变的更加完美。
2.4 if嵌套语句
经典案例:
例1.判断httpd服务有没有启动
If 判断是否启动
嵌套iF 如果启动------输出已启动
如果没启动----判断是否安装---如果安装---启动
如果没安装----安装---如果安装成功---启动
如果安装不成功-----报错
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
在cd 的dome4.sh里面
法一:
法二;
3. case语句
case 语句可以使脚本程序的结构更加清晰、层次分明,常用于服务的启动、重启、停止的脚本,有的服务不提供这种控制脚本,需要用case语句编写
case 语句主要适用于以下情况: 某个变量存在多种取值
,需要对其中的每一种取值分别执行不同的命令序列
。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个 不同的条件,而 case 语句只是判断一个变量的不同取值。
格式:
case 变量值 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 1
;;
* )
默认命令序列
esac
case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号 “|”表示或,如“A|B”。
最后的“*)”表示默认模式,其中的*相当于通配符。
case 语句的执行流程:
首先
使用“变量值”与模式 1 进行比较,若取值相同则执行模式 1 后的命令序列,直到遇见双分号“;;”后跳转至 esac,表示结束分支;若与模式 1 不相匹配
, 则继续与模式 2 进行比较,若取值相同则执行模式 2 后的命令序列,直到遇见双分号“;;”后 跳转至 esac,表示结束分支……依此类推,若找不到任何匹配的值,则执行默认模式“*)” 后的命令序列,直到遇见 esac 后结束分支。
3.1经典案例:
3.1.1 检查用户输入的字符类型**
#!/bin/bash
read -p "请输入一个字符,并按Enter键确认:" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "你输入的是空格,*,_,等特殊字符"
esac
3.1.2 编写 apache 启动服务脚本**
#!/bin/bash
case $1 in
start)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd start"
;;
stop)
/usr/bin/systemctl $1 httpd
/usr/bin/ps aux | grep httpd
echo "httpd stop"
;;
restart)
echo "httpd STOP......"
/usr/bin/ps aux | grep httpd
/usr/bin/systemctl $1 httpd
echo "httpd restart"
;;
status)
/usr/bin/systemctl $1 httpd
;;
*)
echo "plases input start|stop|restart|status"
esac
3.1.3罚抄案例
read -p " 请输入你的分数: " score
case $score in
100 )
echo "秀儿!"
;;
9[0-9]) //表示90到99
echo "$score 分,抄10遍!"
;;
[78][0-9]) //表示70到89
echo "$score 分,抄20遍!"
;;
6[0-9]) //表示60到69
echo "$score 分,抄30遍!"
;;
[0-9]|[1-5][0-9] ) //表示0-9 和10-59 |表示或
echo "$score 分,全抄30遍!"
;;
*)
echo " 输入有误! "
esac
3.1.4一年四季【1-3】是第一季度,【4-6】是第二季度,【7-9】第三季度,【10-12】第四季度
#!/bin/bash
read -p "请输入月份[ 数字1-12 ]:" m
case $m in
[1-3])
echo "当前是$m月份,为第一季度";;
[4-6])
echo "当前是$m月份,为第二季度";;
[7-9])
echo "当前是$m月份,为第三季度";;
1[0-2])
echo "当前是$m月份,为第四季度";;
*)
echo "输入有误"
esac
3.1.5 石头剪刀布小游戏
#!/bin/bash
a=$[RANDOM%3+1]
read -p "请猜拳(1.石头 2.剪刀 3.布)" b
case "$b" in
[1])
if [ $a -eq 1 ];then
echo "平手,电脑出的石头";elif
[ $a -eq 2 ];then
echo "你赢了,电脑出的剪刀";else
[ $a -eq 3 ]
echo "惜败,电脑出的布"
fi
;;
[2])
if [ $a -eq 1 ];then
echo "惜败,电脑出的石头";elif
[ $a -eq 2 ];then
[ $a -eq 3 ]
echo "你赢了,电脑出的布"
fi
;;
[3])
if [ $a -eq 1 ];then
echo "你赢了,电脑出的石头";elif
[ $a -eq 2 ];then
echo "惜败,电脑出的剪刀";else
[ $a -eq 3 ]
echo "平手,电脑出的布"
fi
;;
*)
echo "请输入1-3之间的数"
esac
总结:
1.条件测试的语法
- 文件测试、整数值比较、字符串比较、逻辑测试
2.if条件语句的语法
- 单分支、双分支、多分支
3.case多分支语句的语法