第一节:Shell概述
1.什么是shell?
Shell是一种脚本语言,字面理解就是个“壳”,是操作系统(内核)与用户之间的桥梁,充当命令解释器的作用,将用户输入的命令翻译给系统执行。
2.Shell脚本能做什么 ?
(1)基础配置:系统初始化操作、系统更新、内核调整、网络、时区、SSH优化等。
(2)安装程序:LNMP、LAMP、MySQL、Nginx、Redis等。
(3)配置变更:Nginx Conf、PHP Conf、MySQL Conf、Redis Conf等。
(4)业务部署:Shell配合Git、Jenkins实现自动化部署PHP、Java代码,以及代码回滚。
(5)日常备份:MySQL全备 + 增量 + binlog + crond + Shell脚本备份等。
(6)信息采集:Zabbix + Shell: 对硬件、系统、服务、网络的监控等。
(7)日志分析:ELK:取值->排序->去重->统计->分析等。
(8)服务扩容/缩容:Zabbix + Shell
扩容: 监控服务器cpu, 如cpu负载持续80% + 触发动作(脚本)
脚本: 调用api开通云主机->初始化环境->加入集群->对外提供访问
缩容: 监控服务器cpu使用率20%->判断有多少web节点->判断是否超过预设->缩减到对应的预设状态->变更负载的配置
第二节:Shell脚本的执行方式
1.sh bash 不需要执行权限,会重新打开一个会话窗口执行
[root@backup /scripts]# sh test.sh &>/dev/null
[root@backup /scripts]# bash test.sh &>/dev/null
2.path/脚本名 全路径执行 ./scriptname 需要执行权限,会重新打开一个子shell执行,执行完成后会自动关闭开启的子shell
[root@backup /scripts]# ./test.sh
[root@backup /scripts]# chmod +x /scripts/test.sh
[root@backup /scripts]# /scripts/test.sh 全路径执行
[root@backup /scripts]# ./test.sh
3.source scriptname / . scriptname 使用点和source来执行,把程序调用到当前shell执行
[root@backup /scripts]# source test.sh
[root@backup /scripts]# . test.sh
4.cat 脚本名 | bash
[root@backup /scripts]# cat test.sh |bash
5.bash < 脚本名
[root@backup /scripts]# bash < test.sh
6.登录式shell与非登录式shell
登录时shell 是通过用户及密码的方式进行登录的
非登录式shell 不是通过用户及密码的方式进行登录的, bash 命令直接进入一个非登录shell(子shell) 脚本的方式
7.配置文件的生效顺序
登录式 (父shell)
/etc/profile
/etc/profile.d/test.sh
.bash_profile
.bashrc
/etc/bashrc
非登录式shell (子shell)
[root@backup ~]# bash
.bashrc
/etc/bashrc
/etc/profile.d/test.sh
第三节:Shell中变量的使用
1.自定义变量 --只能在当前会话窗口生效
变量名=值
[root@backup ~]# Name=web01 #定义
[root@backup ~]# echo $Name #调用
web01
[root@backup ~]# echo $Name_123
[root@backup ~]# echo ${Name}_123 #变量名后面如果有其他内容,需要把变量名用{}扩起来
web01_123
set #显示所有定义的变量
unset #取消定义的变量
单双引号与不加引号及反引号的区别
- 单引号 强引用,所见即所得
- 双引号 弱引用,所见即所得,会解析变量
- 不加引号 所见即所得,会解析变量,如果出现了空格,不会把他看做是一个整体
- 反引号 先执行反引号里面的命令,把输出结果交给外面的命令 跟 $() 同义 ,里面必须是可执行命令
2.系统环境变量(为了区分一般使用大写)
在当前shell及子shell生效
[root@backup ~]# export NAME=web #在当前shell定义变量
[root@backup ~]# echo $NAME #父shell调用变量
web
[root@backup ~]# bash #进入子shell
[root@backup ~]# echo $NAME #子shell调用变量
web
[root@backup ~]# env #显示所有系统环境变量
要想使定义的变量永久生效 ,写入配置文件中即可
3.预定义变量
$0 #当前shell脚本的文件名
$1 #第1个shell脚本位置参数
$2 #第2个shell脚本位置参数
$3 #第3个shell脚本位置参数
$* #所有传递的位置参数-------
不加引号相同 ---->加引号区别:$*将所有的参数看作整体输出|$@将所有的参数单独输出
$@ #所有传递的位置参数-------
$# #总共传递的参数个数
$$ #当前程序运行的 PID
$? #上一个命令执行的返回结果
$! #上一个在后台运行脚本的PID 调试使用
$_ # 获取脚本的最后一个参数 相当于ESC .
4.位置变量
N {10} 位置变量大于10 必须要用{}括起来
5.Shell赋值传参
read -p 简单用法
[root@backup /scripts]# cat read-1.sh
#!/bin/bash
read -p "请输入一个数字:" num
echo "你输入的数字为:$num"
read -p "请输入mysql的密码:" -s password #-s回显你输入的内容