shell脚本知识点2

Shell-day02

1. 昨日回顾


1. Shell的课程大纲

2. 什么是Shell?

	命令解释器   交互式   非交互式
	
	echo  $-    Shell的设置   himBH   交互式    hB  非交互式
	
3. 什么是Shell脚本?

	脚本的组成:命令的堆积+特定的语法+特定的格式=文件  .sh为结尾
	
4. 为什么要学习Shell 

	提升运维的工作效率,减少不必要的工作。
	
5. 学习Shell需要哪些准备条件

	vim的熟练使用    命令基础  三剑客及正则表达式   常见的服务的部署、优化排错。
	
6. 如何学好Shell

	阅读、模仿、阅读、模仿
	
	多练、多思考、再练、再思考-坚持如此循环下去
	
	掌握各种语法   形成自己的开发风格  
	
	从简单做起,简单判断、简单循环
	
	学会分析问题,形成编程思维
	
	变量名要规范,不要拿来主义
	
7. Shell能干什么

	基础配置、安装服务、配置变更、业务部署、日常备份、信息采集、日志分析、服务的扩容及缩容
	
8. Shell脚本的开发规范及习惯

	一出手就是专业和规范的习惯。
	
	统一脚本存放目录   推荐使用Vim  以.sh为结尾
	
	脚本开头要写#!/bin/bash   幻数 
	
	要有作者及版本信息
	
	脚本注释
	
	成对的符号或者格式、语法要一次书写完成
	
9. 脚本的执行方式

	脚本是如何执行的?
	
	1. bash  sh     #无需执行权限的  自己生成一个shell执行命令        
	
	2. path/  ./   #使用路径      需要执行权限  自己生成一个shell执行命令
    
    3. source  .    #无需执行权限  将代码调入到当前环境下执行
    
    4. cat  | bash  #无需执行权限的  自己生成一个shell执行命令  
    
    5. bash <  sh <  #无需执行权限的  自己生成一个shell执行命令  
	
10. 登录式和非登录式

	exit命令   可以退出登录式和非登录式
	
	logout	  不可以退出非登录式

11. 变量的基本介绍 

	什么是变量
	
	变量的定义要求: 字母  下划线  数字组成  不能数字开头
	
	变量名采用驼峰法表示
	
	ip=xxx
	IP=xxx
	Ip=xxxx
	Host_Ip=xxx
	
	定义变量的方式
	
	用户自定义  系统环境变量  位置参数变量  预定义变量 
	
12. 变量定义对的实践

	定义变量  Name=qls  
	
	显示变量的值  echo $Name
	
	set  env  
	
	取消变量   unset  
	
	单双引号 不加引号 反引号的区别  
	
	系统环境变量   export  
	
	位置变量  $1 $2 ..$n  ${10}
	
	预定义变量  系统的特殊变量  
	
	$0  
	
	$* 
	
	$@
	
	$#
	
	$?
	
	$$
	
	$-   
	
	$!
	
	$_    
	
	将命令的执行结果传递给变量  
	
	$()  ``  
	
   命令的嵌套使用 $($())  将输出的结果交给变量进行赋值  
   
   

2. Shell变量赋值


跟脚本进行交互方式传递变量 

read变量赋值  

read的示例语法
[root@shell /service/scripts/day02]# cat read-1.sh
#!/bin/bash
read -p "请给变量赋值:" Name
echo "你输入的值为:$Name"
[root@shell /service/scripts/day02]# sh read-1.sh
请给变量赋值:qls
你输入的值为:qls
[root@shell /service/scripts/day02]# Name=qls
[root@shell /service/scripts/day02]# echo $Name
qls

read脚本案例:简单备份场景

[root@shell /service/scripts/day02]# cat read-2.sh
#!/bin/bash
read -p "请输入你要备份的目录为:" Back_Dir
echo "你要备份的目录为:$Back_Dir"
echo "开始备份${Back_Dir}目录........."
echo "目录${Back_Dir}备份完成........."
[root@shell /service/scripts/day02]# sh read-2.sh
请输入你要备份的目录为:/root
你要备份的目录为:/root
开始备份/root目录.........
目录/root备份完成.........

read脚本案例:测试IP地址是否通畅

1. 执行脚本的时候,提示用户输入IP地址

2. 根据用户输入的IP进行判断是否能通  ping

3. IP地址如果能通则把结果告诉用户,不通也告诉用户  通=成功  不通=失败

#第一种方法
[root@shell /service/scripts/day02]# cat read-3.sh
#!/bin/bash
#提示用户输入要进行测试的IP地址
read -p "请输入一个你要测试的IP地址:" Ip
#根据用户输入的IP地址进行测试判断
ping -c1 -W1  $Ip  &>/dev/null && echo "IP地址${Ip}是通畅的......"  || echo "IP地址${Ip}是不通的......"
[root@shell /service/scripts/day02]# sh read-3.sh
请输入一个你要测试的IP地址:10.0.0.254
IP地址10.0.0.254是通畅的......
[root@shell /service/scripts/day02]# sh read-3.sh
请输入一个你要测试的IP地址:10.0.0.81
IP地址10.0.0.81是不通的......

#第二种方法
[root@shell /service/scripts/day02]# cat read-4.sh
#!/bin/bash
#提示用户输入一个IP地址进行测试
read -p "请输入一个你要测试的IP地址:" Ip
#根据用户输入的IP地址进行测试判断
ping -c1 -W1 $Ip &>/dev/null
#根据命令的执行结果进行返回给用户
if [ $? -eq 0 ];then
    echo "IP地址${Ip}是通畅的......"
else
    echo "IP地址${Ip}是不通的......"
fi
[root@shell /service/scripts/day02]# sh read-4.sh
请输入一个你要测试的IP地址:10.0.0.80
IP地址10.0.0.80是通畅的......
[root@shell /service/scripts/day02]# sh read-4.sh
请输入一个你要测试的IP地址:10.0.0.2
IP地址10.0.0.2是不通的......


  echo -e "\033[40;37m 黑底白字 \033[0m"
  echo -e "\033[41;37m 红底白字 \033[0m" 
  echo -e "\033[42;37m 绿底白字 \033[0m" 
  echo -e "\033[43;37m 黄底白字 \033[0m" 
  echo -e "\033[44;37m 蓝底白字 \033[0m" 
  echo -e "\033[45;37m 紫底白字 \033[0m" 
  echo -e "\033[46;37m 天蓝底白字 \033[0m" 
  echo -e "\033[47;30m 白底黑字 \033[0m"

[root@shell /service/scripts/day02]# cat read-4.sh
#!/bin/bash
#提示用户输入一个IP地址进行测试
read -p "请输入一个你要测试的IP地址:" Ip
#根据用户输入的IP地址进行测试判断
ping -c1 -W1 $Ip &>/dev/null
#根据命令的执行结果进行返回给用户
if [ $? -eq 0 ];then
    echo -e "\033[42;37mIP地址${Ip}是通畅的......\033[0m"
else
    echo -e "\033[41;37mIP地址${Ip}是不通的......\033[0m"
fi

read案例: 编写一个脚本修改主机名

1. 提示用户输入新的主机名

2. 询问用户是否真的要修改主机名

3. yes 就修改主机名  执行修改主机名的命名 hostnamectl 

4. 判断是否修改成功,成功之后让其生效

5. no 表示不修改  退出脚本


[root@web01 /service/scripts/day02]# cat read-5.sh
#!/bin/bash
#提示用户输入新的主机名
read -p "请输入你要修改之后的主机名:" Hostname
#提示用户是否真正的修改主机名
read -p "你是否确认要修改你的主机名为:${Hostname},[Yes|No]:" Confirm
#根据用户的输入判断是否要进行修改主机名
if [ "$Confirm" == "Yes" ];then
    echo "你选择了要进行修改主机名"
    hostnamectl  set-hostname  $Hostname &>/dev/null
    if [ $? -eq 0 ];then
        echo "主机名修改成功......"
        bash
    else
        echo "主机名修改失败......"
        exit
    fi
else
    echo "你选择了不修改主机名"
    echo "你想好了再进行修改,脚本退出"
fi



[root@web01 /service/scripts/day02]# cat read-6.sh
#!/bin/bash
#提示用户输入新的主机名
read -p "请输入你要修改之后的主机名:" Hostname
#提示用户是否真正的修改主机名
read -p "你是否确认要修改你的主机名为:${Hostname},[Yes|No]:" Confirm
#根据用户的输入判断是否要进行修改主机名
if [ "$Confirm" == "Yes" ];then
    echo "你选择了要进行修改主机名"
    hostnamectl  set-hostname  $Hostname &>/dev/null
    if [ $? -eq 0 ];then
        echo "主机名修改成功......"
        bash
    else
        echo "主机名修改失败......"
        exit
    fi
fi
if [ "$Confirm" == "No" ];then
    echo "你选择了不修改主机名"
    echo "你想好了在进行修改,脚本退出!"
    exit
else
    echo "你输入的不正确!请输入[Yes|No]"
fi
[root@web01 /service/scripts/day02]# 
[root@web01 /service/scripts/day02]# sh read-6.sh
请输入你要修改之后的主机名:shell
你是否确认要修改你的主机名为:shell,[Yes|No]:No
你选择了不修改主机名
你想好了在进行修改,脚本退出!
[root@web01 /service/scripts/day02]# sh read-6.sh
请输入你要修改之后的主机名:shell
你是否确认要修改你的主机名为:shell,[Yes|No]:no
你输入的不正确!请输入[Yes|No]



[root@web01 /service/scripts/day02]# cat read-7.sh
#!/bin/bash
#提示用户输入新的主机名
read -p "请输入你要修改之后的主机名:" Hostname
#提示用户是否真正的修改主机名
read -p "你是否确认要修改你的主机名为:${Hostname},[Yes|No]:" Confirm
#根据用户的输入判断是否要进行修改主机名
if [ "$Confirm" == "Yes" ];then
    echo "你选择了要进行修改主机名"
    hostnamectl  set-hostname  $Hostname &>/dev/null
    if [ $? -eq 0 ];then
        echo "主机名修改成功......"
        bash
    else
        echo "主机名修改失败......"
        exit
    fi
elif [ "Confirm" == "No" ];then
    echo "你选择了不修改主机名"
    echo "你想好了再进行修改,脚本退出"
    exit
else
    echo "你输入的不正确!请输入[Yes|No]"
fi

read语法示例:修改IP地址

1. 提示用户输入修改之后的IP地址  

2. 提示用户是否确认要进行修改IP地址

3. 根据用户的输入进行判断并执行对应的命令

4. yes  修改IP地址 修改两个网卡  sed

5. 将修改之后的结果告诉用户

6. 重启网络服务进行生效  判断是否重启成功

7. no 表示不修改IP地址 退出

8. 输入不是yes也不是no 提示输入正确的信息


[root@web01 /service/scripts/day02]# cat read-7.sh
#!/bin/bash
#提示用户输入新的IP地址的主机位
read -p "请输入你要修改之后的IP地址的主机位:" Host
#提示用户是否真的修改IP地址的主机位
read -p "你是否确认要进行修改IP地址的主机位:[Yes|No] " Confirm
#根据用户输入的内容进行执行对应的命令
if [ "$Confirm" == "Yes" ];then
    echo "你选择了修改主机IP地址..."
    sed -ri "s#(^IPADDR.*\.).*#\1$Host#g" /etc/sysconfig/network-scripts/ifcfg-eth[01] &>/dev/null #注意这里使用双引号,使用单引号会导致$host 变量无法解析,所有判断语句注意格式对齐。
    if [ $? -eq 0 ];then
        echo "主机的IP地址修改成功..."
        read -p "你是否确认重启网络服务进行生效:[Yes|No] " Confirm1
        if [ "$Confirm1" == "Yes" ];then
            echo "你选择了重启网络服务!注意:重启之后当前窗口会断开,需要使用新的IP地址10.0.0.${Host}进行连接!"
            systemctl  restart network  &>/dev/null
            if [ $? -ne 0 ];then
                echo "网络服务重启失败!"
            fi
        elif [ "$Confirm1" == "No" ];then
            echo "你选择不重启网络服务进行生效!你可以进行手动重启!脚本退出!"
        else
            echo "你输入的信息不正确,[Yes|No]"
        fi
    else
        echo "主机IP地址修改失败!"
        exit
    fi
elif [ "$Confirm" == "No" ];then
    echo "你没有选择要进行修改IP地址!"
else
    echo "你输入的信息不正确,[Yes|No]"
fi
[root@web01 /service/scripts/day02]# sh read-7.sh
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] no
你输入的信息不正确,[Yes|No]
[root@web01 /service/scripts/day02]# sh read-7.sh
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] No
你没有选择要进行修改IP地址!
[root@web01 /service/scripts/day02]# sh read-7.sh
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] Yes
你选择了修改主机IP地址...
主机的IP地址修改成功...
你是否确认重启网络服务进行生效:[Yes|No] No
你选择不重启网络服务进行生效!你可以进行手动重启!脚本退出!
[root@web01 /service/scripts/day02]# sh read-7.sh
请输入你要修改之后的IP地址的主机位:81            
你是否确认要进行修改IP地址的主机位:[Yes|No] Yes
你选择了修改主机IP地址...
主机的IP地址修改成功...
你是否确认重启网络服务进行生效:[Yes|No] Yes
你选择了重启网络服务!注意:重启之后当前窗口会断开,需要使用新的IP地址10.0.0.81进行连接!

Socket error Event: 32 Error: 10053.
Connection closing...Socket close.

3. Shell的变量替换


${#变量}			#获取变量值的长度

${变量#匹配规则}	 #从头开始匹配,最短删除

${变量##匹配规则}	 #从头开始匹配,最长删除

${变量%匹配规则}	 #从尾开始匹配,最短删除

${变量%%匹配规则}	 #从尾开始匹配,最长删除

${变量/旧的字符串/新的字符串}  #替换变量中旧的字符串为新的字符串,只替换第一个匹配到

${变量//旧的字符串/新的字符串}	#替换变量中旧的字符串为新的字符串,全部替换

${变量:匹配规则:匹配规则}		 #索引及切片



[root@shell /service/scripts/day02]# url=www.qls.increase.com
[root@shell /service/scripts/day02]# echo ${url}
www.qls.increase.com
[root@shell /service/scripts/day02]# echo ${#url}	#获取长度
20
[root@shell /service/scripts/day02]# echo www.qls.increase.com | wc -L
20

[root@shell /service/scripts/day02]# echo ${url#*.}	#从前往后,最短匹配到的删除
qls.increase.com
[root@shell /service/scripts/day02]# echo ${url##*.} #从前往后,最长匹配到的删除
com

[root@shell /service/scripts/day02]# echo ${url%.*}	#从后往前匹配,最短删除
www.qls.increase
[root@shell /service/scripts/day02]# echo ${url%%.*} #从后往前匹配,最长删除
www

[root@shell /service/scripts/day02]# echo ${url/w/W}	#把w替换成W,只替换第一个匹配到的
Www.qls.increase.com
[root@shell /service/scripts/day02]# echo ${url//w/W}  #把w替换成W,替换所有的
WWW.qls.increase.com


[root@shell /service/scripts/day02]# echo ${url}
w w w . q l s . i n  c  rease.com

0 1 2 3 4 5 6 7 8 9 10 11 

[root@shell /service/scripts/day02]# echo ${url:0:3} #从0列开始匹配,切出3列
www

[root@shell /service/scripts/day02]# echo ${url:5:3} #从第5列开始匹配,切出3列 
ls.

[root@shell /service/scripts/day02]# echo ${url:5}	#删除前5列  或者从第6个字符开始取到最后
ls.increase.com
echo ${url:0-5} #从右边开始取最后5个字符
echo ${url:0-5:3}#从右边开始数,第5个字符开始,取3个
 

4. 查看当前系统内存的使用状态


内存使用率超过80%则进行报警发邮件

1. 如何查看内存的使用状态   free  -m

2. 如何查看内存的使用率    如何计算使用率   

[root@shell /service/scripts/day02]# free -m | awk '/^Mem/{print $3/$2*100 }'
4.94949

3. 判断使用率的大小 超过80则报警   

[root@shell /service/scripts/day02]# echo "test" |mail -s 'hello' 1176494252@qq.com

4. 没有超过就是正常的


[root@shell /service/scripts/day02]# cat mem_used.sh
#!/bin/bash
#将使用率的大小定义为一个变量
Mem_Used=$(free -m | awk '/^Mem/{print $3/$2*100}')
#根据变量的值进行判断
if [ ${Mem_Used%.*} -gt 80 ];then
    echo -e "\033[41;37m当前内存使用率过高!使用率为:${Mem_Used}%\033[0m"
    echo "当前内存使用率过高!使用率为:${Mem_Used}%" |mail -s "内存使用率过高!" 1176494252@qq.com
    if [ $? -eq 0 ];then
        echo "邮件发送成功!"
    else
        echo "邮件发送失败!"
    fi
else
    echo -e "\033[42;37m当前内存使用率正常!使用率为:${Mem_Used}%\033[0m"
fi


5. 备份场景:备份/etc/目录


1. 备份什么  /etc

2. 备份到哪里  /backup目录

3. 使用什么方式备份  tar zip 

4. 压缩包的名称如何定义  ip_time_etc.tar.gz  

5. 备份的周期  多长时间备份一次  定时任务 每天  


[root@shell /service/scripts/day02]# cat back_etc.sh
#!/bin/bash
#定义变量
Back_Dir=/backup
Ip=$(ifconfig eth0 |awk 'NR==2{print $2}')
Date=$(date +%F)
#提示用户输入要备份的数据目录
read -p "请输入你要备份的目录:" Data_Dir
#判断备份的目录是否存在,存在则不进行创建,不存在则创建
[ -d $Back_Dir ] || mkdir -p $Back_Dir
#判断数据目录是否存在
if  ls -d $Data_Dir  &>/dev/null;then
    echo "数据目录${Data_Dir}存在...."
    #开始打包备份
    cd / && tar czf $Back_Dir/${Date}_${Ip}_${Data_Dir#/}.tar.gz  ${Data_Dir#/}  &>/dev/null && cd - &>/dev/null
    if [ $? -eq 0 ];then     #一定要注意[] 要保持两边空格!!!!这是个深坑!!!!!!
        echo "数据目录${Data_Dir}备份成功...."
    else
        echo "数据目录${Data_Dir}备份失败...."
    fi
else
    echo "你要备份的数据目录${Data_Dir}不存在...."
fi
[root@shell /service/scripts/day02]# ll /backup
ls: cannot access /backup: No such file or directory
[root@shell /service/scripts/day02]# sh back_etc.sh 
请输入你要备份的目录:/etc
数据目录/etc存在....
数据目录/etc备份成功....
[root@shell /service/scripts/day02]# ll /backup
total 9988
-rw-r--r-- 1 root root 10223714 2020-04-21 16:24 2020-04-21_10.0.0.81_etc.tar.gz
[root@shell /service/scripts/day02]# sh back_etc.sh 
请输入你要备份的目录:/usr
数据目录/usr存在....
^C
[root@shell /service/scripts/day02]# ll /backup
total 401972
-rw-r--r-- 1 root root  10223714 2020-04-21 16:24 2020-04-21_10.0.0.81_etc.tar.gz
-rw-r--r-- 1 root root 401391616 2020-04-21 16:26 2020-04-21_10.0.0.81_usr.tar.gz
[root@shell /service/scripts/day02]# sh back_etc.sh 
请输入你要备份的目录:/data
你要备份的数据目录/data不存在....

编写定时任务



Shell变量赋值  

read语法示例  

read示例脚本测试IP地址是否通畅

read示例脚本修改主机名

read示例脚本修改IP地址

Shell变量替换介绍

变量替换案例监控内存的使用率

变量替换案例备份/etc目录

posted @   zbzSH  阅读(46)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示