2.Shell-02-if
1.介绍if
- 1.什么是if
- 判断,if是模仿人类的判断来进行的,true、false两种结果。
2.if基础语法
-
单条件
-
# 伪代码 if [ 如果你有房 ];then 那么我就嫁给你 fi if [ $1 -eq $2 ];then #如果$1等于$2 那么输出ok echo "ok" fi
-
双条件
-
#伪代码 if [ 如果你有房 ];then 那么就嫁 #true 真 条件成立 else 再见 #false 假 条件不成立 fi if [ $1 -eq $2 ];then echo "ok" #如果$1等于$2 那么输出ok else echo "Error" #如果$1不等于$2 那么输出error fi
-
多条件
-
#伪代码 if [ 如果你有房 ];then 就嫁 elif [ 如果你有车 ];then 就嫁 elif [ 如果有钱 ];then 就嫁 else GG fi
-
1.单分支,判断当前用户是不是root执行,如果不是那么返回“ERROR”
-
[root@web01 shell-if]# cat if-03.sh #!/bin/bash ############################################################## # File Name: if-03.sh # Author: xiaolai ############################################################## if [ $USER != "root" ];then echo "ERROR!" exit fi
-
2.双分支,判断当前登录用户是管理员还是普通用户,如果是管理员输出”hey admin“ 如果是普通用户输出”hey guest“
-
[root@web01 shell-if]# cat if-04.sh #!/bin/bash ############################################################## # File Name: if-04.sh # Author: xiaolai ############################################################## if [ $USER == "root" ];then echo "hey admin" else echo "hey guest" fi
-
3.多分支,根据输入一个用户名称,判断输入的用户是否存在当前系统,如不存在则再次判断用户是否在/home下拥有家目录,如果都没有则提示不存在。
-
1.read 提示用户交互,然后输入一个用户名称,这个输入的用户名称需要存储到一个变量中。 2.grep 过滤/etc/passwd 中是否存在这个用户 3.判断/home下是否有该用户的家目录 4.else,提示用户不存在。 [root@web01 shell-if]# cat if-05.sh #!/bin/bash ############################################################## # File Name: if-05.sh # Author: xiaolai ############################################################## read -p "请输入你要查询的用户: " users if grep "$users" /etc/passwd &>/dev/null;then echo "$users 存在系统中" elif ls -d /home/$users &>/dev/null; then echo "$users 用户不存在该系统,但用户家目录存在" else echo "$users 不存在该系统中,也不存在家目录" fi
-
4.通过脚本传入两个参数,进行整数关系比较。比如: if.sh [ 1 2 | 2 2 | 2 3 ],请使用双分支和多分支两种方式实现。
-
[root@web01 shell-if]# cat if-06.sh #!/bin/bash ############################################################## # File Name: if-06.sh # Author: xiaolai ############################################################## if [ $1 -eq $2 ];then #判断$1与$2是否相等 echo "$1 = $2" else if [ $1 -gt $2 ];then #判断$1 是否大于 $2 echo "$1 > $2" else # $1 小于 $2 echo "$1 < $2" fi fi # 多分支 [root@web01 shell-if]# cat if-07.sh #!/bin/bash ############################################################## # File Name: if-06.sh # Author: xiaolai ############################################################## if [ $1 -eq $2 ];then #判断$1与$2是否相等 echo "$1 = $2" elif [ $1 -gt $2 ];then #判断$1 是否大于 $2 echo "$1 > $2" else #$1 小于 $2 echo "$1 < $2" fi
3.基于文件进行判断
-
1.备份文件至/backup/system/filename-2020-06-04,如果该目录不存在则自动创建。
-
1.需要用户交互的输入需要备份的文件 2.判断目录是否存在。如果不存在则创建 3.执行cp命令完成备份操作。 [root@oldboy ~]# cat if-8.sh #!/bin/bash Dest=/backup/system Date=$(date +%F) read -p "请输入你要备份的文件:" src_file #判断目录是否存在,如果目录不存在则创建该目录 if [ ! -d $Dest ] then mkdir -p $Dest fi #执行备份操作 cp -rp ${src_file} $Dest/filename_${Date}
-
2.继需求1,判断备份的文件是否存在,如果不存在则提示”No such file or directory“,然后退出。
-
[root@web01 shell-if]# cat if-08.sh #!/bin/bash Dest=/backup/system Date=$(date +%F) read -p "请输入你要备份的文件: " Src_File #判断用户输入的文件是否存在 if [ ! -f ${Src_File} ];then echo "${Src_File} No such file or directory" exit fi #判断目录是否存在,如果目录不存在则创建该目录 if [ ! -d $Dest ];then mkdir -p $Dest fi # 执行备份操作 cp -rp ${Src_File} $Dest/filename_${Date}
-
3.继需求1、2,判断备份的文件是否为空,如果为空则提示"This is file empty",然后退出。
-
[root@web01 shell-if]# cat if-08.sh #!/bin/bash Dest=/backup/system Date=$(date +%F) read -p "请输入你要备份的文件: " Src_File #判断用户输入的文件是否存在 if [ ! -f ${Src_File} ];then echo "${Src_File} No such file or directory" exit fi #判断用户备份的文件是否为空 if [ ! -s ${Src_File} ];then echo "${Src_File} This is file empty" exit fi #判断目录是否存在,如果目录不存在则创建该目录 if [ ! -d $Dest ];then mkdir -p $Dest fi # 执行备份操作 cp -rp ${Src_File} $Dest/filename_${Date}
4.基于整数判断
1.用户执行脚本,sh status.sh nginx,则检查nginx服务的运行状态。(仅支持传递一个参数)
1.控制用户仅能传递一个参数 $#
2.检查服务的运行状态,systemctl status nginx
[root@web01 shell-if]# cat if-09.sh
#!/bin/bash
if [ $# -eq 1 ];then
#检查服务的状态
systemctl status $1 &>/dev/null
#判断服务运行的结果
if [ $? -eq 0 ];then
echo "$1 服务正在运行"
else
echo "$1 服务没有运行"
fi
else
echo "USAGE: sh $0 service_name"
exit
fi
2.查看磁盘/当前使用状态,如果使用率超过30%则报警发邮件
1.如何查看 /分区的磁盘使用状态
2.提取 /分区使用状态百分比
3.将已使用的百分比与我们设定的阈值30%进行比对
超过百分之30则发邮件报警 ( 写到一个文件中 用户:时间:磁盘的状态情况 )
没有超过百分之30则不处理
[root@web01 shell-if]# cat if-10.sh
#!/bin/bash
#1.提取磁盘使用的百分比
Disk_Use=$(df -h | grep ‘/$‘ |awk ‘{print $5}‘)
Date=$(date +%F-%T)
#2.判断磁盘使用百分比是否超过30,如果超过,则写入一个文件中。
if [ ${Disk_Use%\%} -ge 30 ];then
echo "${USER}:${Date}: Disk Is Use ${Disk_Use}" >> /tmp/disk_use.txt
fi
5.基于字符进行判断
[root@web01 shell-if]# cat if-11.sh
#!/bin/bash
read -p "请输入一个字符: " action
if [ -z $action ];then
echo "请不要直接回车..."
exit
fi
echo "你输入的是: $action"
额外补充一个:多条件比对
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002
else
umask 022
fi
if [ $UID -gt 199 -a "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
umask 002 #真 (必须两个条件都为真)
else
umask 022 #假 (只要有一个条件不为真)
fi
真真为真
真假为假
**提示学生输入自己的成绩。
1.如果分数大于0小于59提示补考。
2.如果分数大于60小于70提示良好。
3.如果分数大于71小于85提示好。
4.如果分数大于86小于100提示优秀。*
[root@web01 shell-if]# cat if-12.sh
#!/bin/bash
read -p "请输入你的成绩: " Cj
if [ -z $Cj ];then
echo "请输入正确的成绩分数.."
exit
fi
if [ $Cj -ge 0 ] && [ $Cj -le 59 ];then
echo "你需要补考"
elif [ $Cj -ge 60 ] && [ $Cj -le 70 ];then
echo "成绩良好"
elif [ $Cj -ge 71 ] && [ $Cj -le 85 ];then
echo "成绩挺好"
elif [ $Cj -ge 86 ] && [ $Cj -le 100 ];then
echo "成绩优秀"
else
echo "成绩的分数范围是0-100"
exit
fi
#注意,该脚本存在一个缺陷:如果输入非数字,则会出现语法错误。 (问题:怎么才能让别人输入的必须是数字呢?)
#控制用户输入的是纯数字
if [[ ! $Cj =~ ^[0-9]+$ ]];then
echo "请输入纯数字,,"
exit
fi
编写一个创建用户的脚本。 (oldxu10)
1.提示用户输入要创建用户的前缀,必须是英文。 oldxu
2.提示用户输入后缀,必须是数字。 10
3.如果前缀和后缀都没有问题,则进行用户创建。【如果该用户已经创建,需要提示已创建,没有创建才进行创建操作。】
1.交互:read
2.判断用户输入的前缀是否是全英文
3.判断用户输入的后缀是否是全数字
4.判断 前缀+后缀 是否存在系统中
存在: 提示该用户已存在系统中
否则: 创建该用户
[root@web01 shell-if]# cat if-13.sh
#!/bin/bash
read -p "请输入你要在该系统中创建的用户前缀[英文] " qz
if [[ ! $qz =~ ^[a-Z]+$ ]];then
echo ""
echo "------------------------------"
echo "用户的前缀需要输入纯英文...."
exit
fi
read -p "请输入你要在该系统中创建的用户后缀[数字] " hz
if [[ ! $hz =~ ^[0-9]+$ ]];then
echo ""
echo "------------------------------"
echo "用户的后缀需要输入纯数字..."
exit
fi
users=${qz}${hz}
id $users &>/dev/null #0表示用户存在系统 1表示用户不存在系统
if [ $? -ne 0 ];then
useradd $users
echo "$users 创建成功"
else
echo "$users 已经存在"
fi
6.shell-if练习题
需求1:判断一个机器是否存活,能ping通就算存活。
1.是传递一个IP去 探测
1.read 交互传递
2.直接脚本后面跟上IP地址 ( 传参 )
[root@web01 shell-if]# cat if-14.sh
#!/bin/bash
if [ $# -ne 1 ];then
echo "请传递一个IP地址"
exit
fi
ping -c2 $1 &>/dev/null
if [ $? -eq 0 ];then
echo -e "\033[32m $1 地址通 \033[0m"
else
echo -e "\033[31m $1 地址不通 \033[0m"
fi
2.准备一个ip.txt文件 ( 很多的IP地址 ) ( "了解" --后面讲解的内容 for )
[root@web01 shell-if]# cat if-15.sh
#!/bin/bash
for ip in $(cat ip.txt) #每次获取一行内容复制给ip变量
do
ping -c2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo -e "\033[32m $ip 地址通 \033[0m"
else
echo -e "\033[31m $ip 地址不通 \033[0m"
fi
done
需求2:监控内存小于500M和磁盘容量小于10G,则发邮件报警
1.提取内存还剩多少可用 free -m | awk ‘/^Mem/ {print $NF}‘
2.提取磁盘/ 容量,还剩多少可用 df -h | awk ‘/\/$/ {print $4}‘
3.if 并且关系
[root@web01 shell-if]# cat if-16.sh
#!/bin/bash
Free=$(free -m | awk ‘/^Mem/ {print $NF}‘)
Disk=$(df -h | awk ‘/\/$/ {print $4}‘)
if [ $Free -lt 500 -a ${Disk%G} -lt 10 ];then #内存低于500M并且磁盘/分区可用不足10G
echo "报警"
else
echo "当前状态良好"
echo "内存可用大小为: ${Free}M 磁盘可用空间是: ${Disk}"
fi
需求3:检测本机当前用户是否为管理员,如果是则使用 yum 安装 vsftpd 如果不是,则提示您非管理员。
1.如何判断自己是不是管理员root
$USER = root
$UID = 0
[root@web01 shell-if]# cat if-17.sh
#!/bin/bash
#if [ $USER == "root" ];then #这种方式不够严谨(因为不是每台 机器的root都是超级管理员)
if [ $UID -eq 0 ];then #这种方式较为严谨(UID为0一定是超级管理员)
yum install vsftpd -y
if [ $? -eq 0 ];then
echo -e "\033[32m vsftpd服务已经安装完毕 \033[0m"
else
echo "vsftpd服务在安装过程中出现意外"
fi
else
echo "你不是管理员用户,没有权限执行"
fi
需求4:根据相同的系统不同版本,配置不同的yum源
centos
6 6系统配置6的源
7 7系统配置7的源
保证脚本的通用,在6或7系统执行时,不需要修改脚本。
1.首先判断当前系统是什么版本。
2.根据不同的版本配置不同源即可。
[root@web01 shell-if]# cat if-18.sh
#!/bin/bash
system_status=$(cat /etc/redhat-release | awk ‘{print $(NF-1)}‘)
if [ ${system_status%%.*} -eq 7 ];then
echo "执行安装centos7的源"
elif [ ${system_status%%.*} -eq 6 ];then
echo "执行安装centos6的源"
else
echo "没有识别出操作系统版本"
exit
fi
需求5:安装不同版本的PHP,使用echo输出即可,不用真的安装。
1.你得给我提供几个可以安装的版本把?
2.还需要交互输入我的选择:
3.程序根据用户的选择来进行判断,进而安装不同的php版本。
[root@web01 shell-if]# cat if-19.sh
#!/bin/bash
cat <<EOF
##############################
1) Install PHP 5.1
2) Install PHP 5.5
3) Install PHP 7.1
4) Install PHP 7.2
##############################
EOF
read -p "请输入你需要安装的php版本 [ 1 | 2 | 3 | 4 ]: " number
if [[ ! $number =~ ^[0-9]+$ ]];then
echo "请填写对应的序号,不要随意填写"
exit
fi
if [ $number -eq 1 ];then
sleep 3
echo -e "\033[32m Install php5.1 Is Done...... \033[0m"
elif [ $number -eq 2 ];then
echo "Install php5.5 Is Done......"
elif [ $number -eq 3 ];then
echo "Install php7.1 Is Done......"
elif [ $number -eq 4 ];then
echo "Install php7.2 Is Done......"
fi
需求6:
1.如果姑娘小于18岁,打印“未成年”
2.如果姑娘大于18岁小于25岁,打印“表白”
3.如果姑娘大于25岁小于45岁,打印“阿姨好”。
4.如果姑娘大于45岁,打印“奶奶好”
需求7:写一个脚本,提示用户输入身高,如果身高达到180以上全票,120以下免票,其余不能进。
1.需要交互
2.判断超过180则提示全票
3.判断低于120 则免票
4.其余全部 提示拒绝。
[root@web01 shell-if]# cat if-20.sh
#!/bin/bash
read -p "请输入你的身高: " Action
if [[ ! $Action =~ ^[0-9]+$ ]];then
echo "请输入纯整数"
exit
fi
##############################
if [ $Action -ge 180 ];then #大于180
echo "你需要购买全票"
else
if [ $Action -lt 120 ];then #低于120
echo "你可以免票通过"
else
echo "不好意思,你不能进" #既不大于180 也不低于120
exit
fi
fi
需求8:使用root用户清空/var/log/messages日志,并每次执行保留最近100行
1.必须是root
2.备份一下文件 message 最后100行 message.bak
3.将message.bak > message
4.删除message.bak
[root@web01 shell-if]# cat if-21.sh
#!/bin/bash
Log_Path=/var/log/messages
#必须是超级管理员
if [ $UID -ne 0 ];then
echo "Permission Denied..."
exit
fi
if [ -f $Log_Path ];then
#提取文件的最后100行
tail -100 $Log_Path > ${Log_Path}.bak
#清空message文件,并重定向之前最后100行内容
cat ${Log_Path}.bak > $Log_Path
#删除.bak文件
rm -f ${Log_Path}.bak
echo "Clean Log Done......."
else
echo "$Log_Path No such file or directory"
exit
fi
需求9:判断nginx服务是否正常启动,可以通过systemctl、ps、netstat、curl多种方式。
systemctl
1.systemctl status nginx
2.查看状态返回结果 3 表示没启动 0 表示启动
[root@web01 shell-if]# cat if-22.sh
#!/bin/bash
systemctl status nginx &>/dev/null
if [ $? -eq 0 ];then
echo "Nginx 正在运行中...."
else
systemctl restart nginx &>/dev/null
if [ $? -eq 0 ];then
echo "nginx重启启动成功..."
else
echo "nginx重启启动失败..."
fi
fi
需求10:写一个Nginx安装脚本,加入判断,当上一步执行成功在执行下一步,否则退出脚本
1.检查网络
2.检查 yum源 (省略)
3.yum安装软件
...........
4.启动nginx
[root@web01 shell-if]# cat if-23.sh
#!/bin/bash
#1.测试网络
ping -c2 www.baidu.com &>/dev/null
if [ $? -ne 0 ];then
echo "网络故障..."
exit
fi
#2.执行yum操作
rpm -q nginx &>/dev/null
rc=$?
if [ $rc -eq 0 ];then
echo "nginx已经存在系统"
else
yum install nginx -y
fi
需求11:在每月第一天备份并压缩/etc目录的所有内容,存放到/opt/bak目录,存放的形式2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下。
1.定时任务 (每月第一天)
2.备份的源 /etc/ 需要打包压缩命名为2019_04_10_etc.tar.gz
3.存储的 路径 /opt/bak
[root@web01 shell-if]# cat if-24.sh
#!/bin/bash
Src=/etc
Dest=/opt/bak
Date=$(date +%F)
#1.确定存储的目录存在
if [ ! -d $Dest ];then
mkdir -p $Dest
fi
#2.打包/etc直接存储至 $Dest目录中
cd / && tar czf $Dest/${Date}_etc.tar.gz etc/
#3.检查一下
if [ ! -f $Dest/${Date}_etc.tar.gz ];then
echo "备份失败......."
fi
需求12:输入三个数并进行升序排序
1.控制传递的参数是3个
2.对传递的参数进行升降排序
[root@web01 shell-if]# cat if-25.sh
#!/bin/bash
if [ $# -ne 3 ];then
echo "必须传递三个参数"
exit
fi
echo "$1 $2 $3" | xargs -n1 | sort -n
需求13:提示用户输入年份后判断该年是否为闰年 能整除4, 并且不能被100整除则为 闰年
1.提示用户输入年份,read交互操作: ( 闰年、平年 )
2.闰年计算公式:
1.公式1: 年份 / 4 = 整数 并且 年份 / 100 = 余数
2.公式2: 年份 /400 =整除就是闰年
[root@web01 shell-if]# cat if-26.sh
#!/bin/bash
read -p "请输入你想查询的年份: " Action
if [ $(($Action%4)) -eq 0 -a $(($Action%100)) -ne 0 ] || [ $(($Action%400)) -eq 0 ];then
echo "$Action 是闰年"
else
echo "$Action 是平年"
fi
需求14:根据用户输入密码位数,生成随机密码(包含数字、大小写字母、特殊符号)
??1.怎么生成随机数 mkpasswd -l 8
??2.控制输入的长度,最少8位
??
[root@web01 shell-if]# cat if-27.sh
#!/bin/bash
read -p "请输入你要生成的随机密码位数: " Action
#让用户必须输入数字
if [[ ! $Action =~ ^[0-9]+$ ]];then
echo "请输入整数,,,,"
exit
fi
#判断用户需要生成的字符长度必须高于7
if [ $Action -ge 7 ];then
pw=$(mkpasswd -l $Action)
echo "你生成的随机密码是 $Action 位,密码如下: $pw"
else
echo "随机的密码的复杂度必须满足7位以上"
exit
fi
备份mysql,手动输入你需要备份的库名称,以备份wordpress为例: mysqldump -uroot -poldxu.com -B wordpress > /opt/word.sql
1.给用户看一下目前有哪些数据库
2.提示用户输入 他需要备份 的 数据库名称
3.判断保存的目录是否存在
3.执行备份命令
[root@db01 ~]# cat backup_mysql.sh
#!/usr/bin/bash
Path=/backup/mysql
Date=$(date +%F)
#判断备份的目录是否存在,如果不存在则执行创建操作 ( || 前者命令执行成功,后者命令不执行。前者命令执行不成功,后者命令执行。)
[ -d $Path ] || mkdir -p $Path
mysql -uroot -poldxu.com -e "show databases;" #非交互式展示所有的库
read -p "请输入你要备份的库名称: " dbname
# 如果 dbname变量 为空则执行else下面的内容,如果 dbname 不为空这执行then下面的语句。
if [ ! -z $dbname ];then
mysqldump -uroot -poldxu.com -B $dbname > $Path/${dbname}-${Date}.sql
else
echo "请输入正确的库名称..."
exit
fi
增加判断:如果用户填写的库名称不存在,则不让其进行备份操作。
[root@db01 ~]# cat backup_mysql.sh
#!/usr/bin/bash
Path=/backup/mysql
Date=$(date +%F)
[ -d $Path ] || mkdir -p $Path
mysql -uroot -poldxu.com -e "show databases;"
read -p "请输入你要备份的库名称: " dbname
if [ ! -z $dbname ];then
database_name=$(mysql -uroot -poldxu.com -e "show databases;" | grep -w "$dbname" | wc -l)
if [ $database_name -eq 1 ];then
mysqldump -uroot -poldxu.com -B $dbname > $Path/${dbname}-${Date}.sql
else
echo "你输入 $dbname 库名称不对,请重新选择并输入"
exit
fi
else
echo "请输入正确的库名称..."
exit
fi