- 1.介绍if
- 多分⽀
[root@web01 shell-if]#cat if-07.sh
3.基于⽂件进⾏判断 - 2. IF基于不同的判断
- !/bin/bash
- 6.习题实践
- 需求1:判断⼀个机器是否存活,能ping通就算存活。
- 需求2: 监控内存小于500M和磁盘容量小于10G,则发邮件报警
- 需求3:检测本机当前用户是否为管理员,如果是则使使用yum 安装 vsftpd 如果不是,则提示您非管理员。
- 需求4:根据相同的系统不同版本,配置不同的yum源
- 需求5:安装不同版本的PHP,使用echo输出即可,不用真的安装。
- 需求6:根据不同年龄给出不同回答
- 需求7:写⼀个脚本,提示输入用户身高,如果身高达到180以上全票,120以下免票,其余不能进。
- 需求8:使用root用户清空/var/log/messages⽇志,并每次执行保留最近100行
- 需求9:判断httpd服务是否正常启动,可以通过systemctl、ps、netstat、curl多种方式。
- 需求10:编译安装Nginx安装脚本,加入判断,当上⼀步执行成功在执行下一步,否则退出脚本
- *需求11:在每月第一天备份并压缩/etc目录的所有内容,存放到/opt/bak⽬录,存放的形式
- 需求12:输入三个数并进行升序排序
- 需求13:提示用户输入年份后判断该年是否为闰年 能整除4, 并且不能被100整除则为 闰年 1.提示用户输入年份,read交互操作: ( 闰年、平年 )
- *需求14:根据用户输入密码位数,生成随机密码(包含数字、大小写字母、特殊符号)
- Ps: 如何防止脚本 多个窗口重复运行?
- 内置Action函数
- 扩展练习15:输入身份证号码,判断身份证信息
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.单分支:
if [ 如果你有房 ];then 简单示例: if [ $1 -eq $2 ];then #如果$1等于$2 那么输出ok
那么我就嫁给你 echo "ok"
fi fi
2.双分支结构
if [ 如果你有房 ];then 简单示例: if [ $1 -eq $2 ];then
那么就嫁 #true 真 条件成⽴ echo "ok" #如果$1等于$2 那么输出ok
else else
再⻅ #false 假 条件不成⽴ echo "Error" #如果$1不等于$2 那么输出error
fi
3.多分支结构
if [ 如果你有房 ];then
就嫁
elif [ 如果你有⻋ ];then
就嫁
elif [ 如果有钱 ];then
就嫁
else
GG
fi
4.多种流程控制结构练习
①单分⽀ 需求 判断当前⽤户是不是root执⾏,如果不是那么返回“ERROR”
[root@web01 shell-if]# cat if-03.sh
#!/bin/bash
if [ $USER != "root" ];then
echo "ERROR!"
exit
fi
②双分⽀ 需求 判断当前登录⽤户是管理员还是普通⽤户,如果是管理员输出”hey admin“ 如果是普通⽤
户输出”hey guest“
[root@web01 shell-if]# cat if-04.sh
#!/bin/bash
if [ $USER == "root" ];then
echo "hey admin"
else
echo "hey guest"
fi
③多分⽀ 需求 根据输⼊⼀个⽤户名称,判断输⼊的⽤户是否存在当前系统,如不存在则再次判断⽤户
是否在/home下拥有家⽬录,如果都没有则提示不存在。
1.read 提示⽤户交互,然后输⼊⼀个⽤户名称,这个输⼊的⽤户名称需要存储到⼀个变量中。
2.grep 过滤/etc/passwd 中是否存在这个⽤户3.判断/home下是否有该⽤户的家⽬录
4.else,提示⽤户不存在。
[root@web01 shell-if]# cat if-05.sh
#!/bin/b4ash
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
综合练习**
通过脚本传⼊两个参数,进⾏整数关系⽐较。⽐如:_ _if.sh [ 1 2 | 2 2 | 2 3 ],请使⽤双分⽀和多
分⽀两种⽅式实现。
# 单分支
[root@web01 shell-if]# cat if-06.sh
#!/bin/bash
if [ $1 -eq $2 ];then #判断$1与$2是否相等
echo "$1 = $2"
else if [ $1 -gt $2 ];then #判断$1 是否⼤于
echo "$1 > $2"
else # $1 ⼩于 $2
echo "$1 < $2"
fi
fi
多分⽀
[root@web01 shell-if]# cat if-07.sh
3.基于⽂件进⾏判断
#!/bin/bash
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
2. IF基于不同的判断
2.1 基于整数进行判断
参数 | 说明 (整型对比) | 示例 |
---|---|---|
-eq | = 条件为真 | [ 1 -eq 10 ] |
-ne | ≠ 条件为真 | |
-gt | > 条件为真 | |
-lt | < 条件为真 | |
-ge | ≥ 条件为真 | |
-le | ≤ 条件为真 |
practice **
⽤户执⾏脚本,sh status.sh nginx,则检查nginx服务的运⾏状态。(仅⽀持传递⼀个参数)
1.控制⽤户仅能传递⼀个参数 $#
2.检查服务的运⾏状态,systemctl status nginx
[root@web01 shell-if]# cat if-09.sh
#/bin/bash
# 仅支持1个传递参数
if [ $# -ne 1 ];then
echo "仅支持传递1个参数: Useage: $0 { nginx | httpd zabbix-agent | vsftpd | server_name}"
exit
fi
#2. 检查该服务是否运行,及状态
systemctl status $1 &>/dev/null
Rc=$?
if [ $Rc -eq 0 ];then
echo " $1 服务已启动 "
elif [ $Rc -eq 4 ];then
echo " $1 服务未安装"
elif [ $Rc -eq 3 ];then
echo " $1 服务未启动"
else
echo "状态异常,请执行systemctl status $1查看"
fi
判断进程的状态,如果启动则打印进程
#bin/bash
# 获取进程的详情,首先判断当前服务是否正在运行,如果运行则输出他的进程详情,否则提示进程没有详情。
# 1 启动了
# 0 未启动
process_status_pid=$(pidof $1) # 获取所有的进程ID编号
result=$(pidof $1 | wc -l) # 获取进程ID编号,转换为整数模式 ( 1 表示进程启动了 0 表示进程没有启动)
# 基于获取的进程ID整数判断,如果为1,说明进程存活
if [ $result -eq 1 ];then
# get_master_process变量中存储的是该进程的父进程
get_master_process=$(echo $process_status_pid | awk '{print $NF}')
# 通过ps过滤父进程,将详情赋值给 ps_status变量
ps_status=$(ps -ef | grep ${get_master_process} | grep -v grep )
echo "$1 进程详情...."
echo "$ps_status"
else
echo "$1 暂未启动"
fi
2.2 基于文件进行判断
参数 | 说明(对文件判断) | 示例 |
---|---|---|
-d | 目录存在则为真 | [ -dfile ] |
-f | 文件存在则为真 | [ ! -f file ] 假 |
-r | 文件存在且可读为真 | |
-w | 文件存在且可写为真 | |
-x | 文件存在且可执行为真 | |
-e | 文件/目录存在则为真 | |
-s | (文件存在)至少有一个字符则为真 | |
!-s | (文件存在)是内容为空 |
**
一、备份⽂件⾄/backup/system/filename-2020-06-04,如果该⽬录不存在则⾃动创建。
1.需要⽤户交互的输⼊需要备份的⽂件
2.判断⽬录是否存在。如果不存在则创建
3.执⾏cp命令完成备份操作。
[root@web01 shell-if]# cat if-08.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} # 执⾏备份操作
二、判断备份的⽂件是否存在,如果不存在则提示”No such file or directory“然后退出。
[root@web01 shell-if]# cat if-08.sh
#/bin/bash
#判断文件是否为空
read -p "你要查询的文件是? " File
#答应查询文件的状态
if [ ! -f $File ];then
echo "你要查询 $File 文件不存在"
exit
fi
if [ ! -s $File ];then
echo "This $File file is empty"
exit
else
echo "This $File file is not empty"
fi
三、判断备份的⽂件是否为空,如果为空则提示“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"
fi
#判断⽬录是否存在,如果⽬录不存在则创建该⽬录
if [ ! -d $Dest ];then
mkdir -p $Dest
fi
# 执⾏备份操作
cp -a ${Src_File} $Dest/filename_${Date}
*2.3 基于字符进行比较
参数 | 说明 | 示例 [[ -z $pid ]] 双对括号,变量不用加双引号 |
---|---|---|
== | 字符等于则条件为真 | [ “$a” == “$b” ] |
!= | 字符不相等则条件为真 | [ “$a” != “$b” ] |
-z | 字符串的长度为零则为真 | [ -z “$a” ] |
-n | 字符串的长度不为零则为真 | [ -n “$a” ] |
查看磁盘 / 使⽤状态,如果使⽤率超过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
[root@web01 shell-if]# cat if-11.sh
#!/bin/bash
read -p "请输入用户名称: " Action
if [ -z "$Action" ];then
echo "请不要直接回车>.."
exit
fi
echo "你输入的是 $Action"
- 额外补充⼀个:多条件⽐对
#!/bin/bash
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
practice **
[root@web01 shell-if]#**提示学⽣输⼊⾃⼰的成绩。 1.如果分数⼤于0⼩于59提示补考。 2.如果分数⼤于60⼩于70提示良好。 3.如果分数⼤于71⼩于85提示好。 4.如果分数⼤于86⼩于100提示优秀。*
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:根据用户输入密码位数,生成随机密码(包含数字、大小写字母、特殊符号)
- yum install -y expect
- 怎么⽣成随机数 mkpasswd -l 8
- 控制输⼊的⻓度,最少8位
[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地区文件