1.什么是shell?
shell是一个命令解释器,在操作系统的最外层,负责桥接与用户进行对话,将用户输入的命令翻译给操作系统,并将处理 的结果输出至屏幕.
-
shell命令存在两种使用方式:
- 交互式:登录终端,执行命令,返回结果.再次输入命令,等待结果.最后结束工作退出shell会话,当退出shell会话后,当前的shell会话也就终止了.
- 非交互式:在这种模式下,shell不与你进行交互,而是直接读取某个文件进行执行.当文件从头执行到尾结束后当前的shell也就终止了.
2.什么是shell脚本?
将命令堆积在一起,顺序启动
特定的格式+特定的语法+系统的命令=文件
3.shell脚本能做什么?
1.基础配置系统初始化操作系统更新、内核调整、网络、时区、SSH优化
2.安装程序部置LNMP、LNMT、 MySQL. Nginx、 Redis、 ELK等等
3.配置变更: Nginx Conf, PHP Conf, MySQL Conf. Redis Conf
4.业务部署: Shell配合git. jenkins实现自动化部署php. java代码,以及代码回滚
5.日常备份:使用ShellB脚本对MySQL进行每晚的全备与增量备份
6.信息采集Zabbix + Shell,硬件、系统服务、网络、等等
7.日志分析:取值>排序>去重>统计>分析
8.服务扩容扩容监控服务器集群cpu,如cpu负载持续80% +触发动作(脚本) ,脚本调用api开通
9.服务缩容:监控服务器集群cpu使用率, ->低于20%->检测当前有多少web节点>判断是否超过预
设>缩减到对应的预设状态>变更负载的配置
注意:ShellB脚本主要的作用是简化操作步骤提高效率,减少人为干预,减少系统故障
标准:
- 安装方式一致
- 安装路径一致
- 目录结构一致
- 日志格式一致
- 脚本路径一致
4.shell脚本的相关预备知识?
1.学习shell脚本需要的预备知识
1.熟练使用vim编辑器
2、熟练使用linux基础命令
3、熟练使用linux三剑客
注意如果我们对命令使用不够熟练、对基本服务也不会手动搭建、那么- -定学不会Shell
2.如何才能学好shelI[脚本
1、基础命令+基础服务+练习+思路。( 必备)
2、能看懂Shell脚本-> 能修改Shell脚本->能编写Shell[脚4本-->能优化Shel]脚本
5.shell脚本书写方式
**1. shell脚本命名规则: **
- 名字要有意义,不要使用a、b. C、1、2、3、这种方式命名;虽然inux系统中,文件没有扩展
名的概念,依然建议使用.sh 结尾;名字不要太长,最好控制在30个字节之内.
-
shell脚本格式:
shell脚本开头必须制定脚本运行环境以#!这个特殊符号组合来组成.
2. shell脚本中#的使用:1 #!/bin/bash
2 #*********************
3 #Author: 流星花雨
4 #QQ: 1679338722
5 #Date: 2019-10-28
6 #FileName: var01.sh
7 #URL: https://www.leitiancheng.cn
8 #Description: The test script
9 #*********************
6.脚本的执行方式以及书写规范
1.执行脚本的方式:
- 加执行权限 ./script_filename.sh
- 通过bash直接翻译 bash script_filename.sh
2.#!/usr/bin/bash 加与不加区别
- 如果不明确这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响
- 如果你不清楚是什么类型的脚本,直接使用./执行,那么会读取该脚本的第一行
- 如果第一行是#!/usr/bin/bash 或者没有写该行,那么都将使用默认的bash翻译
- 如果是一个Python脚本,没有写开头,那么执行一定会报错;因为默认使用bash解释器,而我们使用的解释器确是bash.
3.添加命令解释器的几种方式
#!/usr/bin/bash
#!/usr/bin/sh
#!/usr/bin/env bash
#!usr/bin/env python
7.shell变量概述
1.什么是变量
变量是shell中传递数据的一种方法.就是用一个固定的字符串表示不固定的值,便于后续引用.
2.变量命名规范
变量定义命名:大写字母+小写字母+下划线组成,尽量采用字母开头.(变量命名最好携带有一定的含义)
变量定义语法: 变量名=变量值,等号是赋值,需要注意等号两边不能有空格,定义的变量不要与系统命令出现冲突.
3.自定义变量
var="hello world"
echo $var
echo ${var}_log
4. 美元符和美元符@的区别*
不加引号时,而知都是返回传入的参数,但加了引号后,此时*把参数作为一个字符串的整体返回,$@把每个参数作为一个字符串返回
5.什么是变量替换
就是在不改变原有变量的情况下,对变量进行替换
6.为什么要使用变量替换
在需要对某个变量的值进行证书对比,但变量的值是一个小数.我们可以使用替换的方式将小鼠位进行删除,然后再进行证书比对
7.变量替换的几种方式
变量 说明
{变量##匹配规则} 从头开始匹配,最长删除
{变量%%匹配规则} 从尾开始匹配,最长删除
变量/旧字符串/新字符串} 替换变量内的旧字符串为新字符串一个
${变量//旧字符串/新字符串} 替换变量内的旧字符串为新字符串,全部替换
需求一: 通过为止传参的方式,创建Linux系统账户及密码,执行 var1.sh username password
[root@manager-61 ~]#cat variables/var04.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var04.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
useradd $1
echo "$2" |passwd --stdin $1
需求二:通过位置传参的方式,创建linux系统用户及密码,执行var.sh username password控制最多传递两个参数
[root@manager-61 ~]#cat variables/var05.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var05.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
if [ $# -ne 2 ]; then
echo "USER: $0 请传递两个参数 [ username | password ]"
echo "不是传递 $# 个参数"
fi
useradd $1
echo "$2 | passwd --stdin $1"
需求三:使用read 迷你linux登录页面
[root@manager-61 ~]#cat variables/var06.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var06.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo -n "Login: "
read acc
echo -n "Password: "
read pw
echo "你输入用户名是: $acc 你输入的密码是: $pw"
------------------------------------------------------
[root@manager-61 ~]#cat variables/var07.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var07.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
read -p "Login: " acc
read -s -t50 -n6 -p "Password: " pw
echo "你输入的用户名是: $acc 你输入的密码是: $pw"
--------------------------------------------------------
[root@manager-61 ~]#cat variables/var08.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var08.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "$(hostamectl |awk -F ":" '/Operating System:/ {print $2}')"
echo "Kernel $(uname -r) on an $(uname -m)"
read -p "$(hostname) Login: " acc
read -s -t50 -p "Password: " pw
echo ""
echo "你输入的用户名是: $acc 你输入的密码是: $pw"
需求四:使用read编写一个备份脚本,需要用户传递两个参数,源和目标
[root@manager-61 ~]#cat variables/var09.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var09.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "------------请按照如下提示输入--------------"
read -p "请输入你要备份的源文件或者目录: " Source
read -p "请输入你要备份的目录目标位置是: " Dest
echo -e "\t你要备份的源文件或目录是:"
"你要备份的目标位置是: " $Dest
read -p "你确定要备份吗? [ y | n ]" Action
if [ $Action == "y "];then
cp -rpv $Source $Dest
fi
需求五:使用read编写一个探测主机存活的脚本,需要用户传递测试的IP地址
#1.提示用户输入IP
#2.对用户输入的IP进行探测是否存活
#3.判断探测结果是否成功
成功则输出成功的结果
失败则输出失败的结果
[root@manager-61 ~]#cat variables/var10.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var10.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
read -p "请输入需要探测的ip地址: " ip
ping -W1 -c1 "$ip" >/dev/null
if [ $? -eq 0 ];then
echo "$ip" is ok
else
echo "$ip" is errors
fi
需求六:使用shell编写一个修改主机名称的脚本
#1.打印当前的主名称
#2.提示用户输入新的主机名称
#3.询问用户是否执行修改命令
#4.确定修改执行命令
#5.不确定,退出脚本
[root@manager-61 ~]#cat variables/var11.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var11.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "当前的主机名称是: $(hostname)"
read -p "请输入新的主机名称: " new_host
read -p "你确定要将 $(hostname) 变更为 ${new_host} 吗? [ y | n ]" Action
if [ $Action == "y" ];then
hostname ${new_host}
hostnamectl set-hostname ${new_host}
echo "你的主机名称已经修改为 ${new_host}"
fi
-----------------------------变量替换-----------------------------------------------------
需求七:将$PATH中的/bin/替换为/BIN/
[root@manager-61 ~]#cat variables/var12.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var12.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "${PATH//bin/BIN}"
需求八:变量string="Bigdata process is Hadoop,Hadoop is open source project",执行叫蹦后,打印输出string变量,并给出用户以下选项:
1). 打印string长度
2).删除字符串中所有的Hadoop
3).替换第一个Hadoop为Linux
4).替换全部Hadoop为Linux
用户输入数字1|2|3|4,可以执行对应项的功能
[root@manager-61 ~]#vim variables/var13.sh
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var13.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
string="Bigdata process is Hadoop, Hadoop is op en source project"
echo "1)、打印string长度"
echo "2)、删除字符串中所有的Hadoop"
echo "3)、替换第一个Hadoop为Linux"
echo "4)、替换全部Hadoop为Linux"
read -p "请输入对应的数字: [ 1 | 2 | 3 | 4 ]" A ction
if [ ${Action} == 1 ];then
echo "${#string}"
fi
if [ ${Action} == 2 ];then
echo "${string//Hadoop/}"
fi
if [ ${Action} == 3 ];then
echo "${string/Hadoop/Linux}"
fi
if [ ${Action} == 4 ];then
echo "${string//Hadoop/Linux}"
fi
需求九:查看内存/当前使用状态,如果使用率超过80%则报警发邮件
#1.当前内存使用的百分比
#2.进行判断比对
如果大于80% 则会触发邮件
否则,over
[root@manager-61 ~]#cat variables/var14.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: 14.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
Free=$(free -m | awk '/Mem:/ {print $3/$2*100}')
echo "${Free%.*}"
if [ ${Free%.*} -ge 10 ];then
echo "当前占用内存: ${Free} 已超过80%"
fi
需求十:根据系统时间打印今年的时间和明年的时间
[root@manager-61 ~]#cat variables/var15.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var15.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "今年的时间是$(date |awk '{print $6}')"
echo "明年的时间是$(date |awk '{print $6+1}')"
需求十一:根据系统时间获取今年还剩多少星期,已经过了多少星期.
[root@manager-61 ~]#cat variables/var16.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var16.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
num1=$(date +%j)
num2=${}
echo "今年已经过了$(date +%j)天"
echo "今年已经过了$(($(date +%j)/7))周"
echo "今年还剩下天$[365-$(date +%j)]天"
echo "今年还剩下周$[(365-$(date +%j))/7]周"
需求十二: 完成一个计算器功能:传入2个值,然后对传入的值进行加减乘除
[root@manager-61 ~]#cat variables/var17.sh
#!/bin/bash
#*********************
#Author: 流星花雨
#QQ: 1679338722
#Date: 2019-10-28
#FileName: var17.sh
#URL: https://www.leitiancheng.cn
#Description: The test script
#*********************
echo "$1+$2 = $[$1+$2]"
echo "$1-$2 = $[$1-$2]"
echo "$1*$2 = $[$1*$2]"
echo "$1/$2 = $[$1/$2]"