Shell第一天
1.什么是shell?
shell是一个命令解释器,将输入的命令解释给内核,在将内核返回的信息输出值屏幕
当然shell命令是存在交互式、非交互式两种方式。
交互式,其实在我们日常生活中,使用最多的一种模式、登陆终端、执行命令、返回结果。再次输入命令、然后等待结果,最后工作结束退出shell会话,当退出shell会话后,当前的shell会话也就终止了。
非交互式:在这种模式下,shell不与你进行交互,而是直接读取某个文件进行执行。那文件中都有什么,其实,就是一堆的命令。当文件从头执行到尾,结束时,当前shell也终止了。
2.什么是shell脚本
1.将系统命令堆积到一起,顺序执行(简称 系统命令堆积)
2.特定的格式 + 特定的语法 + 系统命令 = 文件
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.日常备份:使用shell脚本对MySQL进行每晚的全量与增量备份
6.信息采集:Zabbix + shell,硬件、系统、服务、网络、等等
7.日志分析:取值->排序->去重->统计->分析
8.服务扩容:扩容,监控服务器集群cpu,如果负载持续80% + 触发动作(脚本);脚本调用api开通云主机->初始化环境->加入集群->对外提供
9.服务缩容:监控服务器集群cpu使用率--低于20%-->检测当前有多少web节点--判断是否超过预设定--缩减至预设定状态--变更负载配置
PS:Shell脚本的主要作用是简化操作步骤,提高效率,减少人为干预,减少系统故障
ps:
1.安装方式一致
2.安装路径一直
3.目录结构一致
4.日志格式一致
5.脚本路径一致
4.学习shell脚本需要的预备知识
1.需要的预备知识
1.熟练使用vim编辑器
2.熟练使用linux命令
3.熟练使用三???2.如何才能学好shell脚本
1.基础命令+基础服务+练习+思路 (必备)
2.能看懂shell脚本+能修改shell脚本+编写shell脚本+优化脚本
5.shell脚本的书写方式
1.shell脚本命名
名字要有意义,不要使用abcd123这种方式命名;虽然说Linux系统中,文件没有名字的概念,依然建议你使用 。sh结尾,名字不要太长,最好是能在30个字节内解决
2.shell脚本格式
脚本开头必须指定脚本运行环境 ,以#!这个特殊符号组合组成例如: #!/usr/bin/bash
3.shell脚本里面 # 的应用
# 注释,主要是用来描绘我们的shell脚本使用的方式
6.shell脚本执行方式
1.当我们给脚本加上执行权限之后,可以 . / 运行
2.如果不希望赋予脚本执行权限,那么可以使用bash命令来运行未给予权限的脚本
!/usr/bin/bash 驾驭不加的区别
1.如果你明确清除这是一个什么类型的脚本,直接调用对应的解释器执行,没有影响
2.如果你不清楚是什么类型的脚本,直接而是用 . / 执行,那么会读取该脚本的指定的解释器,如果没有指定,那么默认会使用bash翻译
书写方式
!/usr/bin/bash
!/usr/bin/sh
!/usr/bin/env bash
!/usr/bin/env python
PS: env会主动寻找命令解释器所在的路径
本章课程
1. 什么是变量variables?
变量是shell 中传递数据的一种方法。
简单理解,变量就是用一个固定的字符串,去表示一个不固定的值。
2.变量的规范
1.大写开头,后面小写或数字都ok
2.变量具有一定的含义
3.白能量的写法 A=1 等于不能有空格
2.Shell变量定义
1.变量定义方式
1.用户自定义变量:认为定义变量名与变量的值
2.系统环境变量:保存的是和系统操作环境相关的数据,所有用户都可以使用
3.位置参数变量:像脚本中进行参数传递,变量名不能自定义,变量作用是固定的
4.预定义的变量:是Bash中已定义好的变量,变量名不能自定义,变量的作用也是固定的。
2.用户自定义变量实例,当前shell有用
export 可以将自定义变量转换为全局变量
3.预先定义的变量参数实例,系统内置变量
$0 当前shell脚本的文件名
$1 第一个shell脚本位置参数
$2 第二个shell脚本位置参数
$3 第三个shell脚本位置参数
$* 所有传递的位置参数是
$@ 所有传递的位置参数是
$# 总共传递的参数个数是
$$ 当前程序运行的PID
$? 上一个命令执行的返回结果
$* 与$@的区别,当不加引号时,二者相同
加入引号时,$* 把它当做一个整体
而$@则是把它拆分开来
-
通过位置传参的方式,创建Linux系统账号及密码
useradd $1 echo $2 | passwd --stdin $1
2.通过传参的方式,Linux系统账户及密码,控制最多传递两个参数
[root@manager var_01.sh]# cat 2.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 2.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
if [ $# -ne 2 ];then
echo "请传递两个参数 [ username | passwd ]"
exit
fi
useradd $1
echo $2 | passwd --stdin $1
3.变量赋值
除了自定义变量,以及系统内置变量,还可以使用read命令通过交互方式传递变量。
read选项 | 选项含义 |
---|---|
-p | 打印信息 |
-t | 限定时间 |
-s | 不回显 |
-n | 指定字符个数 |
使用read方式进行系统登陆
[root@manager var_01.sh]# cat 3.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 3.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
read -p "Login: " acc
read -n6 -t50 -s -p "Passwd: " pw
echo "你输入的用户名是:$acc"
echo "你输入的密码是:$pw"
需求1:使用read模拟Linux登陆页面
[root@manager var_01.sh]# cat 4.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 4.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
echo "hostnamectl | awk -F ":" '/System/{print $2}'"
echo "hostnamectl | grep "Kernel""
read -p "manager Login: " acc
read -s -t50 -p "Password: " pw
echo ""
echo "你输入的用户名: $acc 你输入的密码是: $pw"
需求2.用read备份数据
[root@manager var_01.sh]# cat 5.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 5.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
read -p "请输入要备份的源:" bf
read -p "情输入要备份到哪里去:" mb
read -p "确认是否备份 [ y | n ]: " Action
if [ $Action == y ];then
cp -rpv $bf $mb
fi
需求3:使用read编写一个探测主机存活
[root@manager var_01.sh]# cat 6.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 6.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
read -p "请输入要测试的主机ip:" Ip
ping -W1 -c1 "$Ip" &> /dev/dull
if [ $? -eq 0 ];then
echo "该主机可以通"
else
echo "该主机不可以通讯"
fi
需求4: 修改主机名称
[root@manager var_01.sh]# cat 7.sh
#!/bin/bash
#********************************************************************
#Author: 杨
#QQ: 429007127
#Date: 2019-10-28
#FileName: 7.sh
#URL: http://blog.yangxiaoni.top
#Description: The test script
#********************************************************************
echo "当前主机名称是: $(hostname)"
read -p "请输入要修改的主机名:" Hostname
read -p "你确定要将 $(hostname) 变更为 $(Hostname) 吗?[ y | n ]" Action
if [ $Action == "y" ];then
hostname ${Hostname}
hostnamectl set-hostname $Hostname
echo "你的主角名称已修改成功"
fi
4.shell变量替换
1.什么是变量替换?
简单来说,就是在不改变原有的变量的情况下,对白能力进行替换。
2.为什么要用变量替换
例如:我们需要对某个变量的值进行整数比对,单变量的值是一个小鼠。怎么办?我们可以使用变量替换的方式,将小数位进行删除,然后再进行比对。
3.变量替换的几种方式
变量 | 说明 |
---|---|
${变量#匹配规则} | 从头开始匹配,最短删除 |
${变量##匹配规则} | 从头开始匹配,最长删除 |
${变量%匹配规则} | 从尾开始匹配,最短删除 |
${变量%%匹配规则} | 从尾开始删除,最长删除 |
${变量/旧字符串/新字符串} | 替换变量的旧字符串为新字符串,只能替换第一个 |
${变量//旧字符串/新字符串} | 替换变量内的旧字符串为新字符串,全部替换 |
实例:
------------#
[root@manager ~]# echo ${url#*.} #从头开始匹配,最短匹配
sina.com.cn
[root@manager ~]# echo ${url##*.} #从头开始匹配,最长匹配
cn
------------%
[root@manager ~]# echo ${url%.*}
www.sina.com
[root@manager ~]# echo ${url%%.*}
www
-------------/
[root@manager ~]# echo ${url/c/C}
www.sina.Com.cn
[root@manager ~]# echo ${url//c/C}
www.sina.Com.Cn
需求2:变量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 variables]# cat var12.sh
#!/bin/bash
# Author: Oldux.com QQ: 552408925
# Date: 2019-10-28
# FileName: var12.sh
# URL: https://www.xuliangwei.com
# Description:
string="Bigdata process is Hadoop, Hadoop is open source project"
echo $string
echo "1)、打印string长度"
echo "2)、删除字符串中所有的Hadoop"
echo "3)、替换第一个Hadoop为Linux"
echo "4)、替换全部Hadoop为Linux"
read -p "请输入对应的选项 [ 1 | 2 | 3 | 4 | q ] " Action
if [ $Action -eq 1 ];then
echo "他的长度是: ${#string}"
fi
if [ $Action -eq 2 ];then
echo "${string//Hadoop/}"
fi
if [ $Action -eq 3 ];then
echo ${string/Hadoop/Linux}
fi
if [ $Action -eq 4 ];then
echo ${string//Hadoop/Linux}
fi
需求3:查看内存/当前使用状态,如果使用率超过80%则报警发邮件,思路如下:
1.当前内存使用百分比是多少
2.进行判断比对
如果大于80% 则触发邮件
否则,over
已使用的内存 / 总内存 * 100 = 使用的百分比
mem_use=$(free -m | awk '/^Mem/ {print $3/$2*100}')
if [ ${mem_use%.*} -ge 10 ];then
echo "你的内存已经超过了80% 目前的内存使用状态是 ${mem_use}%"
fi
需求1:根据系统时间,打印今年和明年时间。
[root@manager variables]# cat var14.sh
#!/bin/bash
# Author: Oldux.com QQ: 552408925
# Date: 2019-10-28
# FileName: var14.sh
# URL: https://www.xuliangwei.com
# Description:
echo "今年的时间是: $(date +%Y)"
echo "明年的时间是: $(( $(date +%Y) +1 ))"
需求2:根据系统时间获取今年还剩下多少星期,已经过了多少星期。思路如下:
date +%j 已经过了多少天
一年有365天 已经过了 301 = 还剩下 365-301 = 64 / 7 = 还剩下多少周
已经过了 301 天 / 7 = 已经过了多少周
[root@manager variables]# cat var15.sh
#!/bin/bash
# Author: Oldux.com QQ: 552408925
# Date: 2019-10-28
# FileName: var15.sh
# URL: https://www.xuliangwei.com
# Description:
Date=$(date +%j)
echo "今年已经过了 ${Date} 天"
echo "今年已经过了 $[ ${Date} /7 ] 周"
echo "今年还剩下 $[ ( 365 - ${Date} ) / 7 ] 周"
echo "从现在距离下一个新年还有 $[ 365 - ${Date} ] 天"
需求3:完成一个计算器功能: 传入2个值,然后对传入的值进行 加 减 乘 除,思路如下:
1.使用read让用户传值: $1 $2
2.对传入的值进行运算:
3.输出对应的结果.
[root@manager variables]# cat var16.sh
#!/bin/bash
# Author: Oldux.com QQ: 552408925
# Date: 2019-10-28
# FileName: var16.sh
# URL: https://www.xuliangwei.com
# Description:
echo "$1 + $2 = $[ $1 + $2 ]"
echo "$1 - $2 = $[ $1 - $2 ]"
echo "$1 * $2 = $[ $1 * $2 ]"
echo "$1 / $2 = $[ $1 / $2 ]"
echo "$1 % $2 = $[ $1 % $2 ]"