文章目录
- 条件语句
 - 一、测试
 - 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
 
详细操作图文详解

 



















