Shell-02-if

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

Shell-02-if

上一篇:SSH远程连接不上linux


下一篇:如何在Mac上关闭应用程序?