文章目录
- 条件语句
- 一、测试
- 1、概述
- 格式
- 2、文件测试
- 2.1 格式
- 2.2 常用操作符
- 3、比较整数数值
- 3.1 格式
- 3.2 常用操作符
- 4、字符串比较
- 4.1 格式
- 4.2 常用操作符
- 5、逻辑测试(短路运算)
- 5.1 格式
- 5.2 常用操作符
- 6、双中括号
- 6.1 格式
- 6.2 说明
- 二、if语句
- 1、单分支
- 2、双分支
- 详细操作
- 详细操作图文详解
- 3、多分支
- 详细操作
- 详细操作图文详解
- 三、case语句
- 格式
- 详细操作
- 详细操作图文详解
条件语句
一、测试
1、概述
- test 测试文件的表达式,是否成立,若成功返回0,否则返回其他数值
格式
-
格式1:test 条件表达式
-
格式2:[ 条件表达式 ]
注意中括号 [ ] 和表达式中间需要隔一个空格
2、文件测试
2.1 格式
- [ 操作符 文件或目录 ]
2.2 常用操作符
操作符 | 说明 |
---|---|
-d | 测试是否为目录(Directory) |
-e | 测试目录或文件是否存在(Exist)(选择e判断文件是否存在) |
-a | 测试目录或文件是否存在(Exist) |
-f | 测试是否为文件(File) |
-r | 测试当前用户是否有权限读取(Read) |
-w | 测试当前用户是否有权限写入(Write) |
-x | 测试当前用户是否有权限执行(eXcute) |
-L | 测试是否为软连接文件 |
[root@localhost data]#[ -d /data ]
[root@localhost data]#echo $?
0
[root@localhost data]#ls
aaa.sh fs.sh fw.sh qaz.sh test.sh ww.sh xxx.sh
[root@localhost data]#touch 123
[root@localhost data]#ls
123 aaa.sh fs.sh fw.sh qaz.sh test.sh ww.sh xxx.sh
[root@localhost data]#[ -d /data/123 ]
[root@localhost data]#echo $?
1
[root@localhost data]#[ -e /etc/passwd ]
[root@localhost data]#echo $?
0
3、比较整数数值
3.1 格式
- [ 整数1 -操作符 整数2 ]
3.2 常用操作符
操作符 | 说明 |
---|---|
-eq | 第一个数等于(Equal)第二个数 |
-ne | 第一个数不等于(Not Equal)第二个数 |
-gt | 第一个数大于(Greater Than)第二个数 |
-ge | 第一个数大于或等于(Greater or Equal)第二个数 |
-lt | 第一个数小于(Lesser Than)第二个数 |
-le | 第一个数小于或等于(Lesser or Equal)第二个数 |
[root@localhost data]#who|wc -l
3
[root@localhost data]#[ $(who|wc -l) -le 5 ]
[root@localhost data]#echo $?
0
[root@localhost data]#[ $(who|wc -l) -ge 5 ]
[root@localhost data]#echo $?
1
4、字符串比较
4.1 格式
-
[ 字符串1 = 字符串2 ] 是否相同
-
[ 字符串1 != 字符串2 ] 是否不相同
-
[ -z 字符串 ] 是否为空
-
[ -n 字符串 ] 字符是否存在
4.2 常用操作符
操作符 | 说明 |
---|---|
= | 字符串内容相同 |
!= | 字符串内容不同,! 号表示相反的意思 |
-z | 字符串内容为空 |
-n | 字符是否存在 |
5、逻辑测试(短路运算)
5.1 格式
- [ 表达式1 ] 操作符 [ 表达式2 ] …
- 命令1 操作符 命令2 …
5.2 常用操作符
操作符 | 详细说明 |
---|---|
! | 逻辑否,表示“不”,只有当指定的条件不成立时,整个测试命令的返回值才为 0(结果成立)。 |
&& | 逻辑与,表示“而且”,只有当前后两个条件都成立时,整个测试命令的返回值才为 0(结果成立)。使用 test命令测试时,“&&”可改为“-a”。 |
ll | 逻辑或,表示“或者”,只要前后两个条件中有一个成立,整个测试命令的返回值即为 0(结果成立)。使用 test 命令测试时,“||”可改为“-o”。 |
#判断当前用户是否为root,如果是,则反馈true
[root@localhost data]#whoami #查看当前有效用户名
root
[root@localhost data]#[ `whoami` = root ] && echo "true"
true
#判断当前用户是否为张三,如果是,则反馈true;如果不是,则反馈false
[root@localhost data]#[ `whoami` = zhangsan ] && echo "true" || echo "false"
false
##判断磁盘使用量,磁盘使用量超过80%时,提醒磁盘使用量过高
[root@localhost data]#vim scandisk.sh
#!/bin/bash
use=`df|tr -s " "|grep sda|cut -d " " -f5|tr -d %`
[ $use -ge 80 ] && echo "磁盘使用量过高"||echo "磁盘剩余量足够"
[root@localhost data]#bash scandisk.sh
磁盘剩余量足够
[root@localhost data]#cd /boot
[root@localhost boot]#dd if=/dev/zero of=bigfile
dd: 正在写入"bigfile": 设备上没有空间
记录了10100449+0 的读入
记录了10100448+0 的写出
5171429376字节(5.2 GB)已复制,15.852 秒,326 MB/秒
[root@localhost boot]#cd /data
[root@localhost data]#bash scandisk.sh
磁盘使用量过高
6、双中括号
6.1 格式
- [[ ]]
6.2 说明
-
== :左侧字符串是否和右侧的PATTERN相同
此表达式用于[[ ]]中,PATTERN为通配符
-
=~ :左侧字符串是否能够被右侧的PATTERN所匹配
此表达式用于[[ ]]中,PATTERN为正则表达式
[root@localhost ~]#file=test.log
##通配符以log结尾的文件
[root@localhost ~]#[[ $file == *.log ]]
[root@localhost ~]#echo $?
0
##正则表达式以log结尾的文件
[root@localhost ~]#[[ $file =~ log$ ]]
[root@localhost ~]#echo $?
0
二、if语句
1、单分支
if 判断条件 ;then
执行的命令
fi
2、双分支
if 判断条件 ;then
执行的命令1
else
执行的命令2
fi
详细操作
##检查80端口是否开启,如果开启则反馈httpd正在运行,若是未开启,则启动服务
[root@localhost data]vim fw.sh
#!/bin/bash
systemctl status httpd &>/dev/null
if [ $? -eq 0 ]
then
echo "httpd 服务正在运行"
else
systemctl start httpd
if [ $? -eq 0 ]
then
echo "服务正常启动"
else
echo "服务异常,请检查"
fi
fi
##若是服务已开启,则反馈
[root@localhost data]#bash fw.sh
httpd 服务正在运行
##若是服务未开启,则反馈
[root@localhost data]#bash fw.sh
服务正常启动
详细操作图文详解
3、多分支
if 判断条件1
then
执行命令1
elif 判断条件2
then
执行命令2
elif 判断条件3
then
执行命令3
...
else
以上条件都为假的分支代码 托底
fi
详细操作
##安装httpd服务,先判断操作系统,如果是centos系统,则yum安装,若是ubuntu系统,则使用apt安装,其他暂不支持
[root@localhost data]#vim qaz.sh
#!/bin/bash
if grep -q centos /etc/os-release;then
yum install httpd -y &>/dev/null
if [ $? -eq 0 ]
then
echo "安装成功"
else
echo "安装失败,请检查"
fi
elif grep -q ubuntu /etc/os-release;then
apt install apache2 -y &>/dev/null
if [ $? -eq 0 ]
then
echo "安装成功"
else
echo "安装失败,请检查"
fi
else
echo "你的操作系统不支持"
fi
[root@localhost data]#bash qaz.sh
安装成功
[root@localhost data]#vim fs.sh
#!/bin/bash
read -p "请输入你的分数(0-100的正整数)" num
if [ $num -ge 90 -a $num -le 100 ];then
echo "优秀"
elif [ $num -ge 70 -a $num -le 89 ];then
echo "良好"
elif [ $num -ge 60 -a $num -le 69 ];then
echo "及格"
elif [ $num -ge 0 -a $num -le 59 ];then
echo "不及格"
else
echo "输入有误,请重新输入"
bash $0
#输入错误时不会退出,可以继续输入
fi
[root@localhost data]#bash fs.sh
请输入你的分数(0-100的正整数)96
优秀
[root@localhost data]#bash fs.sh
请输入你的分数(0-100的正整数)84
良好
[root@localhost data]#bash fs.sh
请输入你的分数(0-100的正整数)54
不及格
[root@localhost data]#bash fs.sh
请输入你的分数(0-100的正整数)28
不及格
[root@localhost data]#bash fs.sh
请输入你的分数(0-100的正整数)112
输入有误,请重新输入
请输入你的分数(0-100的正整数)485
输入有误,请重新输入
请输入你的分数(0-100的正整数)66
及格
详细操作图文详解
三、case语句
- case 语句主要适用于以下情况:某个变量存在多种取值,需要对其中的每一种取值分别执行不同的命令序列。这种情况与多分支的 if 语句非常相似,只不过 if 语句需要判断多个不同的条件,而 case 语句只是判断一个变量的不同取值
格式
case 变量值 in
模式 1)
命令序列 1
;;
模式 2)
命令序列 2
;;
……
* )
默认命令序列
esac
case 行尾必须为单词“in”,每一模式必须以右括号“)”结束。
双分号“;;”表示命令序列的结束。
模式字符串中,可以用方括号表示一个连续的范围,如“[0-9]”;还可以用竖杠符号 “|”表示或,如“A|B”。
最后的“*)”表示默认模式,其中的*相当于通配符。
详细操作
##判断输入的是字母还是数字还是特殊符号
[root@localhost data]#vim xxx.sh
#!/bin/bash
read -p "请输入一个字符:" kn
case $kn in
[a-z]|[A-Z])
echo "你输入的是字母"
;;
[0-9])
echo "你输入的是数字"
;;
*)
echo "你输入的是特殊字符"
esac
[root@localhost data]#bash xxx.sh
请输入一个字符:5
你输入的是数字
[root@localhost data]#bash xxx.sh
请输入一个字符:y
你输入的是字母
[root@localhost data]#bash xxx.sh
请输入一个字符:/
你输入的是特殊字符
##判断输入的是yes或者no
[root@localhost ~]#vim ww.sh
#!/bin/bash
read -p "请输入yes或no:" i
case $i in
[yY]|[yY][eE][sS])
echo "您输入的是yes"
;;
[nN]|[nN][oO])
echo "您输入的是no"
;;
*)
echo "您的输入有误,请重新输入"
bash $0
;;
esac
[root@localhost data]#bash ww.sh
请输入yes或no:Y
您输入的是yes
[root@localhost data]#bash ww.sh
请输入yes或no:No
您输入的是no
[root@localhost data]#
[root@localhost data]#bash ww.sh
请输入yes或no:5
您输入的有误,请重新输入
请输入yes或no:o
您输入的有误,请重新输入
请输入yes或no:e
您输入的有误,请重新输入
请输入yes或no:y
您输入的是yes
详细操作图文详解