前言
我们前面已经学习了编写比较简单的shell脚本:各语句按照顺序依次来执行,从而实现“批量处理”的自动化过程,然而,这样比较“单一”的顺序结构写多了,你会不会觉得简单了点?这样,脚本过于机械化,像流水线一样,不够“智能”!那么,怎样才能从容的应对复杂的系统任务呢?我们接下来去学习如何进行条件测试操作,并通过正确使用if语句,从而使shell脚本具备一定的“判断”能力,从而能根据不同的条件来完成不同的管理任务
一、条件测试—字符串比较
基本格式:
格式1
[ 字符串1 = 字符串2 ]
[ 字符串1 !=字符串2 ]
格式2
[ -z 字符串 ]
常用的测试操作符 | 解释 |
---|
= | 第一个字符串与第二个字符串内容相同 | != | 第一个字符串与第二个字符串内容不同,!号表示相反的意思 | -z | 检查字符串内容是否为空,对于未定义或赋予空值的变量将视为空串 |
[root@localhost ~]# read -p "哑铃是不是柴犬:(yes/no)" chai
哑铃是不是柴犬:(yes/no)yes
[root@localhost ~]# [ $chai = "yes" ] && echo "柴犬哑铃"
柴犬哑铃 #若输入的'yes'则输出'柴犬哑铃'
[root@localhost ~]# [ $chai != "no" ] && echo "柴犬哑铃"
柴犬哑铃 #若输入的不是'no'则输出'柴犬哑铃'
[root@localhost ~]# [ -z $chai ] && echo "柴犬哑铃"
[root@localhost ~]# #若不成立则不显示任何内容
二、条件测试—逻辑测试
- 判断两个或多个条件之间的依赖关系
- 当系统任务取决于多个不同的条件的时候,判断是根据这些条件同时成立还是只要其中一个成立等情况
基本格式:
格式1:[ 表达式1 ] 操作符 [ 表达式2 ] ...
格式2:命令1 操作符 命令2 ...
常用测试操作符: -a或&&:逻辑与,“而且”的意思,得前后条件都符合 -o或||:逻辑或,“或者” 的意思,二者其中符合一即可 !:逻辑否,只有当指定的条件不成立的时候,结果才成立 “&&”、“||”操作符能够正常存在于“[[]]”条件判断结构中,但是如果出现在“[]”结构中会报错
[root@localhost ~]# a=6 #为变量赋值
[root@localhost ~]# [ $a -ne 2 ] && [ $a -lt 8 ] #6不等于2而且6小于8
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ $a -eq 1 ] && [ $a -lt 8 ] #6等于1而且6小于8
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ $a -ne 1 -a $a -lt 8 ] #-a的用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]] #&&的[[]]用法
[root@localhost ~]# echo $?
0
[root@localhost ~]# [[ $a -ne 1 && $a -lt 8 ]] && echo 1111
1111 #不等于1且小于8就会输出1111
三、if语句
1.单分支
if 条件测试操作
then 命令序列
fi
[root@localhost ~]
xjj="xjj.txt"
if [ ! -e $xjj ]
then
touch $xjj
echo "$xjj创建成功"
fi
[root@localhost ~]
[root@localhost ~]
此文件xjj.txt已经创建成功!
2.双分支
if 条件测试操作
then 命令序列1
else 命令序列2
fi
- 若条件成立,则执行then后面的命令,忽略else,直到fi结束
- 若条件不成立,则忽略then,跳至else后面的命令序列执行,直到fi结束
- 示例1
#!/bin/bash
cd /opt
a="xjj.txt"
b="jyj"
c="xcf.txt"
if [ -d $b ] #如果/opt下面如果有jyj这个目录,则执行下述命令
then
cd $b
touch $a
echo "$a 已创建"
else #如果没有,则执行下述命令
cd /opt
mkdir $b
cd $b
touch $c
echo "目录$a 和文件$c已创建"
fi
--
[root@localhost ~]# . 11.sh
目录jyj 和文件xjj.txt 已创建 #第一次执行的结果
--
[root@localhost ~]# . 11.sh
xjj.txt 已创建
[root@localhost jyj]# pwd
/opt/jyj #第二次执行的结果
- 示例2 if 80端口是否在监听,then 网站服务已在运行,else启动httpd服务,fi
#!/bin/bash
JJ=`netstat -lnautp | grep "80"`
if [[ $JJ && $? -eq 0 ]];
then
echo "网站服务已在运行"
else
yum -y install httpd &> /dev/null
echo "网站服务已启动"
fi
[root@localhost ~]
[root@localhost ~]
网站服务已启动
[root@localhost ~]
tcp 0 0 192.168.126.15:45790 39.173.174.242:80 TIME_WAIT -
3.多分支
##基本格式
if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
fi
#!/bin/bash
read -p "请输入你的成绩(0~100):" xjj
if [ $xjj -ge 90 ] && [ $xjj -le 100 ]
then
echo "抄10遍"
elif [ $xjj -ge 80 ] && [ $xjj -le 89 ]
then
echo "抄20遍"
elif [ $xjj -ge 60 ] && [ $xjj -le 79 ]
then
echo "抄20遍"
else
echo "全部抄30遍"
fi
--
[root@localhost ~]# vim chao.sh
[root@localhost ~]# . chao.sh
请输入你的成绩(0~100):101
全部抄30遍
[root@localhost ~]# . chao.sh
请输入你的成绩(0~100):90
抄10遍
[root@localhost ~]# . chao.sh
请输入你的成绩(0~100):80
抄20遍
[root@localhost ~]# . chao.sh
请输入你的成绩(0~100):66
抄30遍
四、case分支语句
- case语句主要用于以下场景:当每个变量存在多种取值时,需要对其中的每一种取值分别执行不同的命令序列
- if语句是要判断多个不同条件,而case判断一个变量的不同取值
1.基本格式
case 变量值 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
....
*)
默认命令序列
esac
- case行尾必须为单词 in ,每一行必须以括号“)”结束
- 双分号“;;”表示命令序列结束
- 可以用方括号“[]”表示一个连续的范围;还可以用“|”表示,比如“A|B”
- 最后的“)*”表示默认模式,如果以上取值都不相同,则执行此行
2.示例
每章学完会默写本章学习的知识点,每个阶段学习结束后会有阶段测试,默写和测试不合格者会有相应惩罚 惩罚规则如下: 90-100 错题 抄 10 80-89 错题 抄 20
60-79 错题 抄 30 60以下 全抄 30
#!/bin/bash
read -p "请输入你的分数:" xjj
case $xjj in
9[0-9]|100)
echo "错题抄10遍" ;;
8[0-9])
echo "错题抄20遍" ;;
6[0-9]|7[0-9])
echo "错题抄30遍" ;;
*)
echo "全部抄30遍"
esac
[root@localhost ~]# vim 33.sh
[root@localhost ~]# . 33.sh
请输入你的分数:1000
全部抄30遍
[root@localhost ~]# . 33.sh
请输入你的分数:50
全部抄30遍
[root@localhost ~]# . 33.sh
请输入你的分数:68
错题抄30遍
[root@localhost ~]# . 33.sh
请输入你的分数:88
错题抄20遍
[root@localhost ~]# . 33.sh
请输入你的分数:99
错题抄10遍
|