(接上篇的序号)
8.read 示例:
read示例语法,测试用户输入的IP是否通
1.执行脚本时,提示:请输入ip
2.使用ping命令去探测是否是通,如果通则返回存活,如果不通则返回失败。
if [];then
else
fi
------------------------------------------------------------
#!/bin/bash
#1.提示用户输入一个ip地址
read -p "请输入需要检测的IP地址:" IP
#2.使用ping命令检测IP地址是否通讯
ping -W1 -c1 $ip &>/dev/null
#3.检查上一次命令执行返回状态码是否正常
if [$? -eq 0];then
echo "$IP 能正常通信"
else
echo "$IP 无法正常通信"
fi
----------------------------------------------------------------
[root@test shell]# sh ping1.sh
请输入需要检测的IP地址:127.0.0.1
127.0.0.1 能正常通信
请输入需要检测的IP地址:192.168.1.1
192.168.1.1 无法正常通信
========================================
升华:
使用read命令写一个脚本修改主机名和IP地址
1.提示用户输入主机名称
2.提示用户输入IP地址】
3.询问用户是否输入IP地址
4.真实的执行
代码:
#!/bin/bash
#1.提示用户输入新的主机名称,然后打印新的主机名称
read -p "请输入你想要修改的主机名称:" HostName
echo "你将要修改的主机名称为:$HostName"
#2.是否确认修改,如果确认则真的执行shell命令,如果不确认则退出
read -p "你确认真的要修改如下内容吗[Y|N]?" readly
#3.判断用户输入的是Y还是N,如果是Y则真的执行,如果是其他则退出
if [$readly == "Y"];then
hostnamectl set-hostname $HostName
else
exit
fi
-----------------------------------------------------------
[root@test shell]# sh read.sh
请输入你想要修改的主机名称:www.sm.com
你将要修改的主机名称为:www.sm.com
你确认真的要修改如下内容吗[Y|N]?" n
[root@test shell]# sh read.sh
请输入你想要修改的主机名称:www.sm.com
你将要修改的主机名称为:www.sm.com
你确认真的要修改如下内容吗[Y|N]?" Y
===========================================
9.Shell 变量替换:
变量 说明
${变量#匹配规则} 从头开始匹配,最短删除
${变量##匹配规则} 从头开始匹配,最长删除
${变量%匹配规则} 从尾开始匹配,最短删除
${变量%%匹配规则} 从尾开始匹配,最长删除
${变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串,只替换一个
${变量//旧字符串/新字符串}替换变量内的旧字符串为新字符串,全部替换
eg:1.从前往后删除变量内容
[root@test shell]# url=www.sina.com.cn #定义变量
[root@test shell]# echo ${url} #输出变量的值
www.sina.com.cn
[root@test shell]# echo ${url#*.} #从前往后,最短匹配
sina.com.cn
[root@test shell]# echo ${url##*.} #从前往后,最长匹配
cn
eg:2.从后往前删除变量内容:
[root@test shell]# url=www.sina.com.cn #定义变量
[root@test shell]# echo ${url} #输出变量的值
www.sina.com.cn
[root@test shell]# echo ${url%*.} #从后往前,最短匹配
www.sina.com
[root@test shell]# echo ${url%%*.} #从后往前,最长匹配,贪婪匹配
www
-----------------------------------------------------------
eg:3.变量内容替换:
[root@test shell]# url=www.sina.com.cn #定义变量
[root@test shell]# echo ${url/sina/baidu} #替换sina为baidu
www.baidu.com.cn
[root@test shell]# echo ${url/n/N} #替换第一个小n为大写N
www.siNa.com.cn
[root@test shell]# echo ${url//n/N} #替换全部小n为大写N
www.siNa.com.cN
案例1:在每月第一天备份并压缩/etc目录的所有内容,存放到/root/bak目录,存放的形式
2019_12_09_etc.tar.gz,脚本名称为fileback,存放在/root的家目录下。
分析:
1.备份什么? 源 /etc
2.备份到哪? 目标 /root/bak
3.使用什么方式? 压缩 tar
4.备份的周期? 每月第一天,如何每月第一天。crond
代码:
#!/bin/bash
DestPath=/root/bak
Date=$(date +%Y_%m_%d)
Date=$(date +%Y_%m_%d)
#1.准备目标位置
[ ! -d $DestPath ] && mkdir -p $DestPath
#2.备份到目标位置
tar czf $DestPath/${Date}_etc.tar.gz /etc
[root@test shell]# crontab -l
00 23 1 * * bash /root/fileback &>/dev/null
=================================================
10.流程控制语句if基本概述
1)单分支结构
if [ 如果你有房 ];then
我就嫁给你
fi
eg:
#!/bin/bash
if which ls;then
echo "ok";
fi
2)多分支结构
if [ 如果你有房 ];then
elif [ 你有车 ];then
elif [ 你有钱 ];then
else
再见
fi
eg:
#!/bin/bash
read -p "input a user:" tu
if grep $tu /etc/passwd ;then
echo " 用户 $tu 存在该系统"
elif ls -d /home/$tu ; then
echo "用户 $tu 不存在该系统"
echo "但是 $tu 用户家目录存在"
else
echo "用户 $tu不存在该系统"
echo "$tu 用户也不存在家目录"
fi
==========================================
案例1:场景实践,查看内存/当前使用状态,如果使用率超过80%则报警发邮件。
1.如何查看内存 free -m
2.如何查看内存百分比 使用的/总的*100=使用百分比
free -m|awk '/^Mem/ {print $3/$2*100}'
代码:vi free_use.sh
#!/bin/bash
#监控内存使用百分比,超过百分之80则报警
free_use=$(free -m|awk '/^Mem/ {print $3/$2*100}')
if [ ${free_use%.*} -gt 80 ];then
echo "你的内存超过了百分之80,当前是${free_use%.*}%"
else
echo "你的内存正常使用,当前是${free_use%.*}%"
fi
[root@test shell]# sh free_use.sh
你的内存正常使用,当前是15%。
========================================
案例2:场景实践,在/backup下创建10个.txt的文件,找到/backup目录下所有后缀名为.txt的文件
分析:
1)批量修改txt为txt.bak find
2)把所有的.bak文件打包压缩为123.tar.gz tar
3)批量还原文件的名字,及把增加的.bak再删除 find
代码:
#!/bin/bash
#1.改名
find /bakup -inname "*.txt"|sed -r 's#(.*)#mv \1.bak#g|bash'
#2.打包
tar czf /backup/123.tar.gz $(find /backup -iname "*.bak")
#3.还原
find /backup -inname "*.bak"|sed -r 's#(.*).bak#mv \1.bak \1#g'|bash
-----------------------------------------------------------
升华:
#!/bin/bash
#定义变量
T=txt
B=bak
#把backup 目录下.txt结尾的文件修改成txt.bak
cd /backup && rename $T $T\.$B *.txt
#把所有的.bak 结尾的文件打包压缩为123.tar.gz
tar zcvf /backup/123.tar.gz /backup/*.bak
#还原文件的名字
rename $T\.$B $T *
-----------------------------------------------------------
利用for循环:
#!/bin/bash
File_txt=$(find /back/ -type f -iname ".txt"|xargs >/backup/txt.tt)
for i in $(cat /backup/txt.tt)
do
mv $i $i.bak
done
cd /backup/
tar czf 123.tar.gz ./*.bak
File_bak=$(find /backup/ -type f -iname "*.bak" >/backup/txt.tt)
for j in $(cat /backup/tar.tt)
do
mv $j ${j%.*}
done
==================================================================
3)流程控制语句if文件比较
if语句中的文件比较
参数 说明 示例
-e 文件或目录存在则为真 [ -e file ]
-s 文件存在且至少有一个字符则为真 [ -s file ]
-d 文件存在且为目录为真 [ -d file ]
-f 文件存在且为普通文件则为真 [ -f file ]
-r 文件存在且可读则为真 [ -r file ]
-w 文件存在且可写则为真 [ -w file ]
-x 文件存在且可执行则为真 [ -x file ]
-----------------------------------------------------------
eg1:判断/etc/hosts文件是否存在
if [ -e /etc/hosts ];then #当条件为真时,则执行then后面的代码
echo "ok";
fi
eg2:判断/etc/hosts文件是否存在
if [ -e /etc/hosts ];then
echo "ok"
else
echo "err"
fi
案例3:
1.备份mysql,手动输入你需要备份的库名称
2.提示用户手动输入库名称:read
3.如果用户输入数据库名称,则执行mysqldump命令备份
4.备份到哪,/banckup/mysql
#!bin/bash
DestPath=/backup/mysql
[ -d $DestPath ] || mkdir -p $DestPath
read -p "请输入你要备份的数据库名称:" db
/usr/bin/mysqldump --single-transaction -R
-B $db > $DestPath/${db}_${date +%F}.sql
if [ $? -eq 0 ];then
echo "-----------"
echo "$db 数据库备份成功"
echo "-----------"
fi
4)数值比较 [ 整数1 操作符 整数2 ]
参数 说明 示例 状态
-eq 等于则为真 [ 1 -eq 10 ] 假
-ne 不等于则为真 [ 1 -ne 10 ] 真 条件一致为假,否则为真
-gt 大于则为真 [ 1 -gt 10 ] 假
-lt 小于则为真 [ 1 -lt 10 ] 真
-ge 大于等于则为真 [ 1 -gt 10 ] 假
-le 小于等于则为真 [ 1 -le 10 ] 真
eg:
#!/bin/bash
if [ $# -ge 1 ];then
systemctl status $1 > /dev/null
if[ $? -eq 0 ];then
echo "$1 服务正在运行"
else
echo "$1 服务暂末运行"
fi
else
echo "执行脚本的格式"
echo "sh $0 服务名"
fi
--------------------------------------------------------------
案例4:
场景实践,查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
思路:
1. 怎么查看磁盘 #df -h
2.怎么提取使用率 df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}
#!/bin/bash
Disk_Free=$(df -h|grep "/$"|awk '{print $5}'|awk -F '%' 'print' %1 )
if [ $Disk_Free -ge 80 ];then
echo "Disk Is Use: ${Disk_Free}%" > /tmp/disk_use.txt
fi
--------------------------------------------------------------
案例4--升华:
场景实践,查看磁盘/当前使用状态,如果使用率超过80%则报警发邮件
思路:
1. 怎么查看磁盘 #df -h
2.怎么提取使用率 df -h|grep "/$"|awk '{print ${NF-1}}' echo ${disk/\%/}
3.判断,整数
#!bin/bash
disk_use=$(df -h | grep "/$"|awk '{print ${NF-1}')
if [ ${disk_use/\%} -ge 80 ];then
echo "你的磁盘使用率过高。。。${disk_use}"
else
echo "你的磁盘使用率正常。。。${disk_use}"
fi
--------------------------------------------------------------
5)if字符串比较
参数 说明 示例
== 等于则为真 [ "$a" == "$b"]
!= 不相等则为真 [ "$a" != "$b"]
-z 字符串的长度为零则为真 [ -z "$a" ]
-n 字符串的长度不为空则为真 [ -n "$a" ]
str1 > str2 str1大于str2为真 [ str1 > str2 ]
str1 > str2 str1小于str2为真 [ str1 < str2]
eg:根据学生的录入成绩判断,学生的优劣:
1-59 补考
60-80 合格
80-100 优秀
1.read 读入学生输入的分数
2.比较分数,看是否符合那条件
小于60 补考
等于60 合格
高于80 优秀
[root@test shell]# cat if-2.sh
read -p "请输入你的分数:" fs
if [ $fs -lt 60 ];then
echo "补考"
elfi [ $fs -gt 100 ];then
echo "不老实"
elif [ $fs -ge 80 ];then
echo "优秀"
elif [ $fs -ge 60 ];then
echo "合格"
fi
----------------------------------
升华版:
根据学生的录入成绩判断,学生的优劣:
1-59 补考
60-80 合格
80-100 优秀
1.read 读入学生输入的分数
2.比较分数,看是否符合那条件
小于60 补考
等于60 合格
高于80 优秀
代码:
#!/bin/bash
read -p "请输入你的分数:" fs
if [ $fs -gt 0 -a $fs -lt 60 ];then
echo "补考"
elif [ $fs -ge 60 -a $fs -lt 80 ]; then
echo "合格"
elif [ $fs -ge 80 -a $fs -le 100 ];then
echo "优秀"
else
echo "不老实"
fi
----------------------------------------------------
升级完整版:
vi fs.sh
read -p "请输入你的分数:" fs
#判断数字
expr $fs + 1 &>/dev/null
if [ $? -ne 0 ];then
echo "请输入数字" && exit
fi
#判断是否为空值
if [ -z $fs ];then
echo "不要尝试直接回车,没有用的" && exit
fi
#判断成绩
if [ $fs -gt 0 -a $fs -lt 60 ];then
echo "补考"
elif [ $fs -ge 60 -a $fs -lt 80 ];then
echo "合格"
elif [ $fs -ge 80 -a $fs -le 100 ];then
echo "优秀"
else
echo "不老实"
fi
========================================
11. if语句正则比较:
1)正则对比示例:
#单括号无法使用正则语法
[root@test shell]# [ "$USER" =~^r ];echo $?
bash: [: =~: binary opertor expected ]
#双[]才可以使用正则匹配
[root@test shell]# [[ "$USER" =~ ^r ]];echo $?
0
--------------------------------------
案例5: 判断用户输入的是否是 数字
代码:
#!/bin/bash
read -p "请输入一个数值:" num
if [[ ! "$num" =~ ^[0-9]+$ ]];then
echo "你输入的不是数字,程序退出!!!"
exit
fi
echo "你输入的数字是 $num"
--------------------------------------------
案例6:写一个创建用户的脚本,需要输入创建用户的前缀,比如student,以及后缀。比如123。
#!/bin/bash
read -p "请输入用户的前缀:" qz
if [[ ! $qz =-^[a-Z]+$ ]];then
echo "你输入的不是english。。。"
exit
fi
read -p "请输入创建用户的后缀:" hz
if [[ $hz =- ^[0-9]+$ ]];then
user=${qz}${hz}
id $user &>/dev/null
if [ $? -eq 0 ];then
echo "用户已经存在 $user"
else
useradd $user
echo "用户创建成功 $user"
fi
fi
--------------------------------------------------------------