1.介绍if


1.1 什么是if
判断,if是模仿⼈类的判断来进⾏的,true、false两种结果。

1.2 if基础语法

单分支 双分支 多分支
常用作:不满足就退出-初始化的使用 常用作:
嵌套判断-打怪升级主线任务出现多个选择
常用作:多项选择

echo “当前系统时间为:$(date +%F-%T)”
echo “当前有$[$( w |wc -l)-2]个⽤户登录”
echo “$(w|awk ‘NR>2{print “⽤户”$1,”从”$3”登录”}’)”
echo “CPU过去15分钟的负载为:$(w|awk -F ‘,’ ‘/load/{print $5}’)”
echo “当前系统空闲时间idle为:$(iostat |awk ‘NR==4{print $6}’)”
echo “当前系统可⽤内存为:$(free -m|awk ‘/Mem/{print $NF}’)M”

1.单分支:

  1. if [ 如果你有房 ];then 简单示例: if [ $1 -eq $2 ];then #如果$1等于$2 那么输出ok
  2. 那么我就嫁给你 echo "ok"
  3. fi fi

2.双分支结构

  1. if [ 如果你有房 ];then 简单示例: if [ $1 -eq $2 ];then
  2. 那么就嫁 #true 真 条件成⽴ echo "ok" #如果$1等于$2 那么输出ok
  3. else else
  4. 再⻅ #false 假 条件不成⽴ echo "Error" #如果$1不等于$2 那么输出error
  5. fi

3.多分支结构

  1. if [ 如果你有房 ];then
  2. 就嫁
  3. elif [ 如果你有⻋ ];then
  4. 就嫁
  5. elif [ 如果有钱 ];then
  6. 就嫁
  7. else
  8. GG
  9. fi

4.多种流程控制结构练习

①单分⽀ 需求 判断当前⽤户是不是root执⾏,如果不是那么返回“ERROR”
[root@web01 shell-if]# cat if-03.sh

  1. #!/bin/bash
  2. if [ $USER != "root" ];then
  3. echo "ERROR!"
  4. exit
  5. fi

②双分⽀ 需求 判断当前登录⽤户是管理员还是普通⽤户,如果是管理员输出”hey admin“ 如果是普通⽤
户输出”hey guest“
[root@web01 shell-if]# cat if-04.sh

  1. #!/bin/bash
  2. if [ $USER == "root" ];then
  3. echo "hey admin"
  4. else
  5. echo "hey guest"
  6. fi

③多分⽀ 需求 根据输⼊⼀个⽤户名称,判断输⼊的⽤户是否存在当前系统,如不存在则再次判断⽤户
是否在/home下拥有家⽬录,如果都没有则提示不存在。
1.read 提示⽤户交互,然后输⼊⼀个⽤户名称,这个输⼊的⽤户名称需要存储到⼀个变量中。
2.grep 过滤/etc/passwd 中是否存在这个⽤户3.判断/home下是否有该⽤户的家⽬录
4.else,提示⽤户不存在。

[root@web01 shell-if]# cat if-05.sh

  1. #!/bin/b4ash
  2. read -p "请输⼊你要查询的⽤户: " users
  3. if grep "$users" /etc/passwd &>/dev/null;then
  4. echo "$users 存在系统中"
  5. elif ls -d /home/$users &>/dev/null;then
  6. echo "$users ⽤户不存在该系统,但⽤户家⽬录存在"
  7. else
  8. echo "$users 不存在该系统中,也不存在家⽬录"
  9. fi


综合练习**
通过脚本传⼊两个参数,进⾏整数关系⽐较。⽐如:_ _if.sh [ 1 2 | 2 2 | 2 3 ],请使⽤双分⽀和多
分⽀两种⽅式实现。
# 单分支
[root@web01 shell-if]# cat if-06.sh

  1. #!/bin/bash
  2. if [ $1 -eq $2 ];then #判断$1与$2是否相等
  3. echo "$1 = $2"
  4. else if [ $1 -gt $2 ];then #判断$1 是否⼤于
  5. echo "$1 > $2"
  6. else # $1 ⼩于 $2
  7. echo "$1 < $2"
  8. fi
  9. fi

多分⽀
[root@web01 shell-if]# cat if-07.sh 3.基于⽂件进⾏判断

  1. #!/bin/bash
  2. if [ $1 -eq $2 ];then #判断$1与$2是否相等
  3. echo "$1 = $2"
  4. elif [ $1 -gt $2 ];then #判断$1 是否⼤于 $2
  5. echo "$1 > $2"
  6. else #$1 ⼩于 $2
  7. echo "$1 < $2"
  8. fi

_

2. IF基于不同的判断

2_oldxu.png

2.1 基于整数进行判断

参数 说明 (整型对比) 示例
-eq = 条件为真 [ 1 -eq 10 ]
-ne ≠ 条件为真
-gt > 条件为真
-lt < 条件为真
-ge ≥ 条件为真
-le ≤ 条件为真


practice **

  1. ⽤户执⾏脚本,sh status.sh nginx,则检查nginx服务的运⾏状态。(仅⽀持传递⼀个参数)
  2. 1.控制⽤户仅能传递⼀个参数 $#
  3. 2.检查服务的运⾏状态,systemctl status nginx

[root@web01 shell-if]# cat if-09.sh

  1. #/bin/bash
  2. # 仅支持1个传递参数
  3. if [ $# -ne 1 ];then
  4. echo "仅支持传递1个参数: Useage: $0 { nginx | httpd zabbix-agent | vsftpd | server_name}"
  5. exit
  6. fi
  7. #2. 检查该服务是否运行,及状态
  8. systemctl status $1 &>/dev/null
  9. Rc=$?
  10. if [ $Rc -eq 0 ];then
  11. echo " $1 服务已启动 "
  12. elif [ $Rc -eq 4 ];then
  13. echo " $1 服务未安装"
  14. elif [ $Rc -eq 3 ];then
  15. echo " $1 服务未启动"
  16. else
  17. echo "状态异常,请执行systemctl status $1查看"
  18. fi

判断进程的状态,如果启动则打印进程

  1. #bin/bash
  2. # 获取进程的详情,首先判断当前服务是否正在运行,如果运行则输出他的进程详情,否则提示进程没有详情。
  3. # 1 启动了
  4. # 0 未启动
  5. process_status_pid=$(pidof $1) # 获取所有的进程ID编号
  6. result=$(pidof $1 | wc -l) # 获取进程ID编号,转换为整数模式 ( 1 表示进程启动了 0 表示进程没有启动)
  7. # 基于获取的进程ID整数判断,如果为1,说明进程存活
  8. if [ $result -eq 1 ];then
  9. # get_master_process变量中存储的是该进程的父进程
  10. get_master_process=$(echo $process_status_pid | awk '{print $NF}')
  11. # 通过ps过滤父进程,将详情赋值给 ps_status变量
  12. ps_status=$(ps -ef | grep ${get_master_process} | grep -v grep )
  13. echo "$1 进程详情...."
  14. echo "$ps_status"
  15. else
  16. echo "$1 暂未启动"
  17. fi

2.2 基于文件进行判断

参数 说明(对文件判断) 示例
-d 目录存在则为真 [ -dfile ]
-f 文件存在则为真 [ ! -f file ] 假
-r 文件存在且可读为真
-w 文件存在且可写为真
-x 文件存在且可执行为真
-e 文件/目录存在则为真
-s (文件存在)至少有一个字符则为真
!-s (文件存在)是内容为空

**
一、备份⽂件⾄/backup/system/filename-2020-06-04,如果该⽬录不存在则⾃动创建。

  1. 1.需要⽤户交互的输⼊需要备份的⽂件
  2. 2.判断⽬录是否存在。如果不存在则创建
  3. 3.执⾏cp命令完成备份操作。

[root@web01 shell-if]# cat if-08.sh

  1. #!/bin/bash
  2. Dest=/backup/system
  3. Date=$(date +%F)
  4. read -p "请输⼊你要备份的⽂件: " Src_File #判断⽬录是否存在,如果⽬录不存在则创建该⽬录
  5. if [ ! -d $Dest ];then
  6. mkdir -p $Dest
  7. fi
  8. cp -rp ${Src_File} $Dest/filename_${Date} # 执⾏备份操作

二、判断备份的⽂件是否存在,如果不存在则提示”No such file or directory“然后退出
[root@web01 shell-if]# cat if-08.sh

  1. #/bin/bash
  2. #判断文件是否为空
  3. read -p "你要查询的文件是? " File
  4. #答应查询文件的状态
  5. if [ ! -f $File ];then
  6. echo "你要查询 $File 文件不存在"
  7. exit
  8. fi
  9. if [ ! -s $File ];then
  10. echo "This $File file is empty"
  11. exit
  12. else
  13. echo "This $File file is not empty"
  14. fi

三、判断备份的⽂件是否为空,如果为空则提示“This is file empty”,然后退出,如果存在就进行备份操作。
[root@web01 shell-if]# cat if-08.sh

  1. #!/bin/bash
  2. Dest=/backup/system
  3. Date=$(date +%F)
  4. read -p "请输⼊你要备份的⽂件: " Src_File
  5. #判断⽤户输⼊的⽂件是否存在
  6. if [ ! -f ${Src_File} ];then
  7. echo "${Src_File} No such file or directory"
  8. exit
  9. fi
  10. #判断⽤户备份的⽂件是否为空
  11. if [ ! -s ${Src_File} ];then
  12. echo "${Src_File} This is file empty"
  13. fi
  14. #判断⽬录是否存在,如果⽬录不存在则创建该⽬录
  15. if [ ! -d $Dest ];then
  16. mkdir -p $Dest
  17. fi
  18. # 执⾏备份操作
  19. cp -a ${Src_File} $Dest/filename_${Date}

*2.3 基于字符进行比较

参数 说明 示例
[[ -z $pid ]] 双对括号,变量不用加双引号
== 字符等于则条件为真 [ “$a” == “$b” ]
!= 字符不相等则条件为真 [ “$a” != “$b” ]
-z 字符串的长度为零则为真 [ -z “$a” ]
-n 字符串的长度不为零则为真 [ -n “$a” ]

查看磁盘 / 使⽤状态,如果使⽤率超过30%则报警发邮件

  1. 思路:
  2. 1.如何查看 /分区的磁盘使⽤状态
  3. 2.提取 /分区使⽤状态百分⽐
  4. 3.将已使⽤的百分⽐与我们设定的阈值30%进⾏⽐对
  5. 超过百分之30则发邮件报警 写到⼀个⽂件中 ⽤户:时间:磁盘的状态情况
  6. 没有超过百分之30则不处理

**
[root@web01 shell-if]# cat if-10.sh

  1. #!/bin/bash
  2. #1.提取磁盘使⽤的百分⽐
  3. Disk_Use=$(df -h | grep '/$' |awk '{print $5}')
  4. Date=$(date +%F-%T)
  5. #2.判断磁盘使⽤百分⽐是否超过30,如果超过,则写⼊⼀个⽂件中。
  6. if [ ${Disk_Use%\%} -ge 30 ];then
  7. echo "${USER}:${Date}: Disk Is Use ${Disk_Use}" >>/tmp/disk_use.txt
  8. fi

[root@web01 shell-if]# cat if-11.sh

  1. #!/bin/bash
  2. read -p "请输入用户名称: " Action
  3. if [ -z "$Action" ];then
  4. echo "请不要直接回车>.."
  5. exit
  6. fi
  7. echo "你输入的是 $Action"
  • 额外补充⼀个:多条件⽐对
    1. #!/bin/bash
    2. if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    3. umask 002
    4. else
    5. umask 022
    6. fi
    7. if [ $UID -gt 199 -a "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    8. umask 002 #真 (必须两个条件都为真)
    9. else
    10. umask 022 #假 (只要有⼀个条件不为真)
    11. fi

    practice **
    **提示学⽣输⼊⾃⼰的成绩。
    1.如果分数⼤于0⼩于59提示补考。
    2.如果分数⼤于60⼩于70提示良好。
    3.如果分数⼤于71⼩于85提示好。
    4.如果分数⼤于86⼩于100提示优秀。*
    
    [root@web01 shell-if]# cat if-12.sh ```bash

    !/bin/bash

read -p “请输⼊你的成绩: “ Cj

if [ -z $Cj ];then echo “请输⼊正确的成绩分数..” exit fi fi [ $Cj -ge 0 ];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

#注意,该脚本存在⼀个缺陷:如果输⼊⾮数字,则会出现语法错误。 (问题:怎么才能让别⼈输⼊的必须是数字呢?)<br />** **<br />**<br />**Ps:  控制⽤户输⼊的是纯数字                          **
```bash
if [[ ! $Cj =~ ^[0-9]+$ ]];then 
echo "请输⼊纯数字,," 
exit
fi


practice **

编写⼀个创建⽤户的脚本。 

思路:
oldxu10
1.提示⽤户输⼊要创建⽤户的前缀,必须是英⽂。 
2.提示⽤户输⼊后缀,必须是数字。 
3.如果前缀和后缀都没有问题,则进⾏⽤户创建。【如果该⽤户已经创建,需要提示已创建,没有创建才进⾏创建操作。】

1.交互:read
2.判断⽤户输⼊的前缀是否是全英⽂
3.判断⽤户输⼊的后缀是否是全数字
4.判断 前缀+后缀 是否存在系统中

[root@web01 shell-if]# cat if-13.sh

#!/bin/bash
# 批量创建用户:  提示用户输入要创建名称{ gdx }:  以及要创建的数量 { 100 }  结果: gdx-01 ~~~gdx-100
# 1.用户名称,必须是全字母
# 2.创建的个数,必须是整数,不可以带字母
# 3.不可以输入空

read -p "请输入你要创建的用户: " User

#1.不可以为空:
if [ -z $User ];then
    echo "不可以输入空格..."
    exit
fi

# 2.必须是纯字母
if [[ ! "$User" =~ ^[a-z]+$ ]];then
    echo "请输入纯字母 [a..Z]"
    exit
fi
#######################################################################################

read -p "请输入你要创建的数量: " Number
#1.不可以为空:
if [ -z $Number ];then
    echo "不可以输入空格..."
    exit
fi

# 2.必须是纯字母
if [[ ! $Number =~ ^[0-9]+$ ]];then
    echo "请输入纯字母 [0-9]"
    exit
fi
#######################################################################################

read -p "你要创建的用户名称是: $User 你要创建的数量是: $Number  你确定要创建吗? [ Y | N ]: " Action
if [ $Action == "Y" ];then
    for i in $(seq -w ${Number})
    do
        user_name=$User$i
        useradd $user_name &>/dev/null
        echo "$user_name 创建成功....."
    done
fi


*2.4 基于正则进行判断

示例:

#单括号无法使用正则语法
[root@hsp]# [ "$USER" =~ Ar ];echo $?
bash: [: =~: binary operator expected
2

#双[]才可以使用正则匹配
[root@hsp]# [[ "$USER" =~ Ar ]];echo $?
0

#示例:判断变量是不是全数字
[root@hsp]# num=123
[root@hsp]# [[ "Snum" =~ [O-9]+$ ]];echo $?
0
[root@hsp]# num=123al
[root@hsp]# [[ "$num" =~ ^[O-9]+$ ]];echo $?
1

其中 ~ 其实是对后面的正则表达式表示匹配的意思,如果匹配就输出1, 不匹配就输出0

需求1: 通过正则方式控制用户输入的必须是数字

[root@hsp]# cat if-7.sh
#!/bin/bash
read -p "请输入一个数值: " num
if [[ ! "$num" =~ ^[0-9]+$ ]]; then
echo ”你输入的不是数字,程序退出!! !"exit
fi
echo "你输入的数字是$num"

[[ “$num” =~ ^[0-9]+$ ]] 该变量所有的变量匹配 开头为数字,中间为数字,结尾也是数字则为真。

综合练习

#/bin/bash
# 批量创建用户:  提示用户输入要创建名称{ gdx }:  以及要创建的数量 { 100 }  结果: gdx-01 ~~~gdx-100

# 1.用户名称,必须是全字母
# 2.创建的个数,必须是整数,不可以带字母
# 3.不可以输入空

read -p "请输入你要创建的用户: " User

#1.不可以为空:
if [ -z "$User" ];then
    echo "不可以输入空格..."
    exit
fi

# 2.必须是纯字母
if [[ ! "$User" =~ ^[a-z]+$ ]];then
    echo "请输入纯字母 [a..Z]"
    exit
fi
#######################################################################################

read -p "请输入你要创建的数量: " Number
#1.不可以为空:
if [ -z $Number ];then
    echo "不可以输入空格..."
    exit
fi

# 2.必须是纯字母
if [[ ! $Number =~ ^[0-9]+$ ]];then
    echo "请输入纯字母 [0-9]"
    exit
fi
#######################################################################################

read -p "你要创建的用户名称是: $User 你要创建的数量是: $Number  你确定要创建吗? [ Y | N ]: " Action
if [ $Action == "Y" ];then
    for i in $(seq -w ${Number})
    do
        user_name=$User$i
        useradd $user_name &>/dev/null
        echo "$user_name 创建成功....."
    done
fi

6.习题实践

需求1:判断⼀个机器是否存活,能ping通就算存活。

1.是传递⼀个IP去 探测
1.read 交互传递
2.直接脚本后⾯跟上IP地址 ( 传参 )
[root@web01 shell-if]# cat if-14.sh

#!/bin/bash
if [ $# -ne 1 ];then
echo "请传递⼀个IP地址"
exitfi
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_Ava=$(free -m |awk '/^Mem/{print $NF}')
Disk_Ava=$(df -h | awk '/\/$/{print $4}')  

Free=$(free -m | awk '/^Mem/ {print $NF}')
Disk=$(df -h | awk '/\/$/ {print $4}')
if [ $Free_Ava -lt 500  -a   ${Disk_Ava%.*} -lt 10 ];then #内存低于500M并且磁盘/分区可⽤不
⾜10G echo "报警"
else
echo "当前状态良好"
echo "内存可⽤⼤⼩为: ${Free}M 磁盘可⽤空间是: ${Disk}"
fi

需求3:检测本机当前用户是否为管理员,如果是则使使用yum 安装 vsftpd 如果不是,则提示您非管理员。

1.如何判断⾃⼰是不是管理员root
[root@web01 shell-if]# cat if-17.sh

#!/bin/bash


if [ $UID -eq 0 ];then #这种⽅式较为严谨(UID为0⼀定是超级管理员)    
#if [ $USER == "root" ];then #这种⽅式不够严谨(因为不是每台 机器的root都是超级管理员)
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岁,打印“奶奶好”
思路:  
交互式输入年龄
对输入类型进行判断


示例:

#/bin/bash

read -p "请输入菇凉的年龄: " Action

# 回车
if [ -z $Action ];then
    echo "说完年龄在走..."
    exit
fi

# 整数,两位数
if [[ ! $Action =~ ^[0-9]{2}$ ]];then
    echo "年龄没有这么大的..."
    exit
fi

if [ $Action -lt 18 ];then
    echo "$Action 未成年,不配"
elif [ $Action -ge 18 -a $Action -le 25 ];then
    echo "$Action 不错,可以考虑"
elif [ $Action -gt 25 -a $Action -lt 45 ];then
    echo "$Action 回老家,别折腾"
else
    echo "$Action ........"
fi

需求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
 rm -f ${Log_Path}.bak                    #删除.bak⽂件
 echo "Clean Log Done......."

else
echo "$Log_Path No such file or directory"
exit
fi

需求9:判断httpd服务是否正常启动,可以通过systemctl、ps、netstat、curl多种方式。

systemctl
1.systemctl status httpd
2.查看状态返回结果 3 表示没启动 0 表示启动

[root@web01 shell-if]#cat if-22.sh

#!/bin/bash

# 用户执行脚本,sh status.sh nginx,则检查nginx服务 的运行状态。(仅支持传递一个参数)

# 进程的状态
process_status=$(pidof httpd |wc -l)
if [ ${process_status} -eq 1 ];then
    # 进程存活
    port_status=$(netstat -lntp |grep httpd | wc -l)
    if [ ${port_status} -eq 1 ];then
        # 端口存活
        curl_status=$(curl -s  -w %{http_code} localhost/index.html -o /dev/null)
        if [ ${curl_status} -eq 200 ];then
            echo -e "\033[32m Httpd 进程正常,端口正常,网站正常,状态码为: ${curl_status} \033[0m"
        else
            echo -e "\033[31m Httpd 进程正常,端口正常,网站异常,状态码为: ${curl_status} \033[0m"
        fi
    else
        echo "Httpd 进程存活,端口不存活"
    fi
else
    echo "httpd 进程不存在"
fi
#!/bin/bash
#需求9:判断httpd服务是否正常启动,可以通过systemct1、ps、 netstat、 curl多种方式。

cat <<EOF
提示:输入下列序号代表的方式查询httpd服务的状态
1.systemctl
2.ps
3.netstat
4.curl
EOF
read -p "请输入序号获取httpd服务的状态:[ 1 | 2 | 3 | 4 ] " Action

#以systemctl方式判断该服务是否存在   状态
if [ ${Action} -eq 1 ];then
    systemctl status httpd &>/dev/null
    relust=$?
    if [ ${relust} -eq 4 ];then
        echo "httpd 该服务不存在...请安装服务..."
    elif [ ${relust} -eq 3 ];then
            echo "httpd 该服务处于暂停状态..."
    elif [ ${relust} -eq 0 ];then
        echo "httpd 服务已启动..."
    fi
exit

#以ps方式判断该服务是否存在    进程
elif [ ${Action} -eq 2 ];then
process_status=$(pidof httpd |wc -l)
    if [ ${process_status} -eq 1 ];then
        echo "httpd服务进程存在... "
    elif [ ${process_status} -eq 0 ];then
        echo "httpd服务进程不存在..."
    fi
exit


#以netstat方式判断该服务是否存在   端口
elif [ ${Action} -eq 3 ];then
port_status=$(netstat -lntp |grep httpd | wc -l)
    if [ ${port_status} -eq 1 ];then
                echo "httpd服务端口存活... "
        elif [ ${port_status} -eq 0 ];then
                echo "httpd服务端口不存活..."
        fi
exit


#以curl方式判断该服务是否存在    网站
elif [ ${Action} -eq 4 ];then
curl_status=$(curl -s  -w %{http_code} localhost/index.html -o /dev/null)
        if [ ${curl_status} -eq 200 -o ${curl_status} -eq 304 ];then
                echo "网站运行正常..."
    else
        echo "网站异常,访问失败..."
        fi
exit
fi

需求10:编译安装Nginx安装脚本,加入判断,当上⼀步执行成功在执行下一步,否则退出脚本

4.启动nginx [root@web01 shell-if]# cat if-23.sh

#/bin/bash
#编译安装nginx脚本
ngx_opt=/opt
ngx_version=nginx-1.19.5
ngx_install=/usr/local

# 依赖
yum install gcc redhat-rpm-config  libxslt-devel gd-devel perl-ExtUtils-Embed geoip-devel gperftools-devel pcre-devel openssl-devel -y

#1.下载
if [ ! -f ${ngx_opt}/${ngx_version}.tar.gz ];then
    wget -O ${ngx_opt}/${ngx_version}.tar.gz http://nginx.org/download/${ngx_version}.tar.gz
fi

#2.解压软件包.编译
if [ ! -d ${ngx_opt}/${ngx_version} ];then
    cd ${ngx_opt} && \
    tar xf ${ngx_version}.tar.gz

fi

if [ ! -d ${ngx_install}/${ngx_version} ];then
    cd ${ngx_opt}/${ngx_version} && \
    ./configure --prefix=${ngx_install}/${ngx_version} && \
    make && \
    make install  && \
    ln -s ${ngx_install}/${ngx_version} ${ngx_install}/nginx
    if [ ! -e ${ngx_install}/nginx ];then
        echo "Nginx编译失败..."
        exit
    fi
else
    echo "Nginx已经安装了,无法重复安装"
fi


#3.启动服务  { 80端口是否被占用 }
port_check=$(lsof  -i :80 | wc -l)

if [ ${port_check} -eq 0 ];then
    ${ngx_install}/nginx/sbin/nginx -t &>/dev/null
    if [ $? -eq 0 ];then
        ${ngx_install}/nginx/sbin/nginx
    else
        echo "nginx配置文件异常,无法启动..."
        exit
    fi
else
    #kill占用端口的进程
    kill $(lsof  -i :80 | sed 1d | awk '{print $2}' | xargs)
    port_check=$(lsof  -i :80 | wc -l)
    if [ ${port_check} -eq 0 ];then
        ${ngx_install}/nginx/sbin/nginx -t &>/dev/null
            if [ $? -eq 0 ];then
                    ${ngx_install}/nginx/sbin/nginx
               else
                    echo "nginx配置文件异常,无法启动..."
            exit
            fi
    fi
fi

#4.测试
website_code=$(curl -o /dev/null -s -w %{http_code} "localhost")
If_eth0=$(ifconfig eth0 | awk 'NR==2 {print $2}')

if [ ${website_code} -eq 200 ];then
    echo "Nginx 访问成功,请通过 http://${If_eth0} 访问获取页面.."
else
    echo "nginx 访问失败,请检查,状态码为: ${website_code}"
fi

*需求11:在每月第一天备份并压缩/etc目录的所有内容,存放到/opt/bak⽬录,存放的形式

2019_04_10_etc.tar.gz,脚本名称为fileback,存放在/root的家⽬录下。
1.定时任务 (每月第1天)
2.备份的源 /etc/ 需要打包压缩命名为2019_04_10_etc.tar.gz
3.存储的 路径 /opt/bak

[root@web01 shell-if]# cat if-24.sh

#/bin/bash

backup_path=/opt/bak
Date=$(date +%F)

if [ ! -d ${backup_path} ];then
    mkdir -p ${backup_path}    
fi

cd / && \
tar czf ${backup_path}/${Date}_etc.tar.gz etc

if [ -f ${backup_path}/${Date}_etc.tar.gz ];then
    echo "$(date +%F-%T): Backup....成功" >> /tmp/backup.log
else
    echo "$(date +%F-%T): Backup....失败" >> /tmp/backup.log
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
#!/bin/bash
while read Action
do

    if [ $[ $Action % 4 ] -eq 0  -a  $[ $Action % 100] -ne 0 -o $[ $Action % 400 ] -eq 0  ];then
        echo "$Action 是闰年"
    fi
done < test.txt

[root@manager ~/day2_if ]# seq 1949 2050 >test.txt

*需求14:根据用户输入密码位数,生成随机密码(包含数字、大小写字母、特殊符号)

  1. yum install -y expect
  2. 怎么⽣成随机数 mkpasswd -l 8
  3. 控制输⼊的⻓度,最少8位image.png

  
[root@web01 shell-if]# cat if-27.sh #!/bin/bash

#!/bin/bash
read -p "用户输入要创建名称:" User
read -p "提示用户输入要创建的个数:" Number
read -p "提示用户输入密码的位数:" Count
read -p "创建的用户名称是 $User , 创建个数是 01 ~ $Number , 生成的随机密码位数是: $Count 确定要创建 [ Y | N] " Action

rpm -q expect
if [$? -ne 0 ];then
   yum install expect
   echo "正在准备密码生成工具..."
fi

if [ $Action == "Y" ];then
    for i in $(seq -w ${Number})
    do
        Pass=$(mkpasswd -l $Count)
        # 定义完整的用户名称
        Username=$User$i

        # 判断用户是否存在
        id $Username &>/dev/null
        if [ $? -ne 0 ];then
            useradd $Username && \
            echo "${Pass}" | passwd --stdin $Username &>/dev/null
            echo "${Username}:${Pass} Is Create..."

            # 将创建的结果输出到文件中...
            echo "${Username}:${Pass} Is Create..." >> user_pass.txt
        fi
    done

else
    echo "Bye..."
    exit
fi

Ps: 如何防止脚本 多个窗口重复运行?

# 加锁小技巧
if [ -f /tmp/lock ];then
        echo "$0 脚本正在运行....."
        exit     
fi
touch /tmp/lock

...
...

rm -f /tmp/lock

内置Action函数

#!/bin/bash
. /etc/init.d/functions #通过这个脚本声明函数

hehe(){
rs=0
[ $rs -eq 0 ] 
action "nginx启动中"  /bin/true  #异常状态 /bin/false
}

hehe   #执行: 调用函数


-------------------------------
[root@master2 html]# sh test.sh 
nginx启动中                                         [  OK  ]
改成false
[root@master2 html]# sh test.sh 
nginx启动中                                           [FAILED]

扩展练习15:输入身份证号码,判断身份证信息

公民若需要查询其出生日期,是可以查看居民身份证号码第7—14位数字。身份证号码第7—14位数字是表示公民出生年月日的,二代身份证号码构成如下∶( 1)前1、2位数字表示:所在省(直辖市、自治区)的代码;
(2)第3、4位数字表示:所在地级市(自治州)的代码;
(3)第5、6位数字表示:所在区(县、自治县、县级市)的代码;
(4)第7—14位数字表示:出生年、月、日;
(5)第15、16位数字表示:所在地的派出所的代码;
(6)第17位数字表示性别︰奇数表示男性( 1、3、5、7、9),偶数表示女性(0、2、4、6、8 );
(7)第18位数字是校检码︰也有的说是个人信息码,不是随计算机的随机产生,它是用来检验身份证的正确性。校检码可以是0—9的数字,有时也用x表示。
#!/bin/bash
##############################################################
# File Name: id.sh
# Version: V1.0
# Author: osker
# Web: chongking.com
##############################################################

read -p "请输入18位身份证编号:" id

if [[ $id =~ ^[0-9|X]{18}$ ]];then
    #读入加权因子
    while read line
    do
        wi[$i]=$line
        let i++
    done</root/wi.txt    
    #echo "${wi[@]}"
    #echo "${!wi[@]}"

    #对前17位数字本体码加权求和
    sum=0
    for j in ${!wi[@]}
    do
        a=$[ ${id:$j:1} * ${wi[$j]} ] 
        sum=$[ $a + $sum ]
    done

    #读入校验数组,等号后为校验码,索引为对应的余数
    ch[0]=1
    ch[1]=0
    ch[2]=X
    ch[3]=9
    ch[4]=8
    ch[5]=7
    ch[6]=6
    ch[7]=5
    ch[8]=4
    ch[9]=3
    ch[10]=2

    #求和后的值对11取余
    ys=$[ $sum % 11 ]
    #转换为校验码
    check=${ch[$ys]}

  #----------------------------------------------------
    #检验转换后的校验数是否等于身份证最后一位的值
    if [ $check == ${id:17:1} ];then
        echo "身份证校验通过"
    echo "出生地:$(awk '/'${id:0:2}'0000/{print $1}' id-ar.txt) $(awk '/'${id:0:6}'/{print $1}' id-ar.txt)"
    #echo "地区为:${id:0:2}"

        echo "出生日期:${id:6:8}"
        echo "序号:${id:14:3}"
        echo "校验位:${id:17:1}"
        sex=$[ ${id:17:1}%2 ]
        if [ $sex -eq 1 ];then
            echo "性别:男"
        else
            echo "性别:女"
        fi
    else
        echo "身份证校验失败,请不要随便输入。"
        exit
    fi
elif [[ $id =~ ^[0-9]{16}$ ]];then
    echo "目前不支持16位验证"
    exit
else
    echo "请输入一个正确的id"
    exit
fi

身份证GB11643-1999.pdf #身份证校验算法
wi.txt #wi校验
id-ar.txt #id-ar地区文件

Snipaste_2020-12-06_17-41-08.png