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为结尾
脚本开头要写
要有作者及版本信息
脚本注释
成对的符号或者格式、语法要一次书写完成
9. 脚本的执行方式
脚本是如何执行的?
1. bash sh
2. path/ ./
3. source .
4. cat | bash
5. bash < sh <
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]
read -p "请给变量赋值:" Name
echo "你输入的值为:$Name"
[root@shell /service/scripts/day02]
请给变量赋值:qls
你输入的值为:qls
[root@shell /service/scripts/day02]
[root@shell /service/scripts/day02]
qls
read脚本案例:简单备份场景
[root@shell /service/scripts/day02]
read -p "请输入你要备份的目录为:" Back_Dir
echo "你要备份的目录为:$Back_Dir"
echo "开始备份${Back_Dir}目录........."
echo "目录${Back_Dir}备份完成........."
[root@shell /service/scripts/day02]
请输入你要备份的目录为:/root
你要备份的目录为:/root
开始备份/root目录.........
目录/root备份完成.........
read脚本案例:测试IP地址是否通畅
1. 执行脚本的时候,提示用户输入IP地址
2. 根据用户输入的IP进行判断是否能通 ping
3. IP地址如果能通则把结果告诉用户,不通也告诉用户 通=成功 不通=失败
[root@shell /service/scripts/day02]
read -p "请输入一个你要测试的IP地址:" Ip
ping -c1 -W1 $Ip &>/dev/null && echo "IP地址${Ip}是通畅的......" || echo "IP地址${Ip}是不通的......"
[root@shell /service/scripts/day02]
请输入一个你要测试的IP地址:10.0.0.254
IP地址10.0.0.254是通畅的......
[root@shell /service/scripts/day02]
请输入一个你要测试的IP地址:10.0.0.81
IP地址10.0.0.81是不通的......
[root@shell /service/scripts/day02]
read -p "请输入一个你要测试的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]
请输入一个你要测试的IP地址:10.0.0.80
IP地址10.0.0.80是通畅的......
[root@shell /service/scripts/day02]
请输入一个你要测试的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]
read -p "请输入一个你要测试的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]
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]
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]
请输入你要修改之后的主机名:shell
你是否确认要修改你的主机名为:shell,[Yes|No]:No
你选择了不修改主机名
你想好了在进行修改,脚本退出!
[root@web01 /service/scripts/day02]
请输入你要修改之后的主机名:shell
你是否确认要修改你的主机名为:shell,[Yes|No]:no
你输入的不正确!请输入[Yes|No]
[root@web01 /service/scripts/day02]
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]
read -p "请输入你要修改之后的IP地址的主机位:" Host
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
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]
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] no
你输入的信息不正确,[Yes|No]
[root@web01 /service/scripts/day02]
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] No
你没有选择要进行修改IP地址!
[root@web01 /service/scripts/day02]
请输入你要修改之后的IP地址的主机位:90
你是否确认要进行修改IP地址的主机位:[Yes|No] Yes
你选择了修改主机IP地址...
主机的IP地址修改成功...
你是否确认重启网络服务进行生效:[Yes|No] No
你选择不重启网络服务进行生效!你可以进行手动重启!脚本退出!
[root@web01 /service/scripts/day02]
请输入你要修改之后的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]
[root@shell /service/scripts/day02]
www.qls.increase.com
[root@shell /service/scripts/day02]
20
[root@shell /service/scripts/day02]
20
[root@shell /service/scripts/day02]
qls.increase.com
[root@shell /service/scripts/day02]
com
[root@shell /service/scripts/day02]
www.qls.increase
[root@shell /service/scripts/day02]
www
[root@shell /service/scripts/day02]
Www.qls.increase.com
[root@shell /service/scripts/day02]
WWW.qls.increase.com
[root@shell /service/scripts/day02]
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]
www
[root@shell /service/scripts/day02]
ls.
[root@shell /service/scripts/day02]
ls.increase.com
echo ${url:0-5}
echo ${url:0-5:3}
4. 查看当前系统内存的使用状态
内存使用率超过80%则进行报警发邮件
1. 如何查看内存的使用状态 free -m
2. 如何查看内存的使用率 如何计算使用率
[root@shell /service/scripts/day02]
4.94949
3. 判断使用率的大小 超过80则报警
[root@shell /service/scripts/day02]
4. 没有超过就是正常的
[root@shell /service/scripts/day02]
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]
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]
ls: cannot access /backup: No such file or directory
[root@shell /service/scripts/day02]
请输入你要备份的目录:/etc
数据目录/etc存在....
数据目录/etc备份成功....
[root@shell /service/scripts/day02]
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]
请输入你要备份的目录:/usr
数据目录/usr存在....
^C
[root@shell /service/scripts/day02]
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]
请输入你要备份的目录:/data
你要备份的数据目录/data不存在....
编写定时任务
Shell变量赋值
read语法示例
read示例脚本测试IP地址是否通畅
read示例脚本修改主机名
read示例脚本修改IP地址
Shell变量替换介绍
变量替换案例监控内存的使用率
变量替换案例备份/etc目录
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现