自动化运维
1 shell语法 运行机制 常见应用
2 自动化代码发布案例
1 自动化运维:
编写shell脚本实现运维过程自动化
2 shell
1 shell概念:
命令解释器(应用程序和操作系统之间的接口)
2 shell分类
常用:linux命令行(重点是bash)
3 查看当前系统shell:
echo $SHELL
/bin/bash
4 查看当前系统兼容性支持的其他shell版本
cat /etc/shells
5 shell脚本
命令放到文件中执行,文件就叫shell脚本
6 创建脚本
1 用记事本(vim)创建脚本文件
2 文件名要有意义,.sh结尾
3 文件内容首行指定脚本解释器:#!/bin/bash
4 单行注释: #开头
多行注释: :<<字符 ... 字符 (将字符们重定向到啥都不干)
7 脚本执行
1 bash 脚本名(启动子进程,在子进程中执行脚本命令)
2 ./脚本名(启动子进程(名字叫脚本名),在子进程中执行脚本命令)
3 source 脚本名(不启动子进程,直接在当前shell执行命令)
8 开发规范
1 不要用中午注释
2 成对内容一次性写出
3 适当缩进(类似python缩进风格)
9 定义变量
普通变量:
1 变量名=变量值 (变量值不可用有特殊字符)
2 变量名='变量值'(变量值可以有特殊字符)
3 变量名="变量值" (变量套变量)
命令变量:
将命令的输出作为变量值赋给变量名
变量名=`命令`
变量名=$(命令)
命令只在定义时执行一遍
10 变量访问
1 $变量名
2 "$变量名" (将变量值作为字符串)
3 ${变量名} (限定变量名范围)
4 "${变量名}" (推荐使用)
unset 变量名 (取消变量)
11 本地变量
在哪定义,在哪访问
12 全局变量(环境变量)
1 查看当前系统全局变量
env
2 定义全局变量
1 变量名=值
export 变量
先定义后转换
2 export 变量名=值 (二合一)
3 全局变量生效范围:
当前shell 和子shell生效(子shell继承父shell的全局变量)
要想所有环境都生效:
1 修改~/.bashrc (当前用户生效---》打开新shell或source执行后生效)
2 修改/etc/profile(所有用户都生效--》重启或者source执行)
13 内置变量
脚本相关:
$0 脚本名
$$ 执行脚本的进程号
$n 第n个参数(n>=10时要加{})
$# 参数个数
$? 上一条指令的执行结果(0--》成功 非0----》失败,上一条指令若是脚本,代表脚本中最后一条指令的返回值)
字符串截取:
${变量名:起始位置:截取长度}
(反向截取时,0-X)
默认值:
${变量名:-默认值} (变量不存在则输出默认值)
${变量名:+提示信息} (变量存在则是从提示信息)
14 表达式
逻辑转化成控制
1 测试语句
test 条件
[ 条件 ] (方括号内左右各有一个空格)
数值比较(比较符左右各有一个空格)
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于
字符串比较:
== != (跟python相同)
2 逻辑表达式
命令1 && 命令2 (1 成功则执行2)
命令1 || 命令2 (1失败则执行2)
3 文件表达式
-f 判断是否是文件
-d 判断是否是目录
-x 判断是否可执行(目录可执行)
4 计算表达式
$(( 计算表达式 )) (括号中间是计算过程)
let 等式
15 常见符号
1 重定向
应用程序的输出:
1 标准输出(正常运行时)
2 标准错误(错误提示)
分别重定向:
bash 6-chongdingxiang.sh 1> res.log 2>err.log
合并重定向:
bash 6-chongdingxiang.sh > res.txt 2>&1(将标准错误重定向到标准输出相同的位置)
丢弃:
bash 6-chongdingxiang.sh > /dev/null(垃圾桶) 2>&1
2 管道符
命令1 | 命令2
(1 的输出作为2的输入)
3 后台展示符
命令 & (命令放到后台运行)
16 常用命令
1 grep 搜索文件内容
grep -rn bash .
在当前目录下递归所有文件(包含子目录),查找包含bash的行并显示行号
2 find
find . -name "*sh"
在当前目录以及子目录中查找文件名末尾是sh的文件
3 sed 文本编辑工具
-i 代表修改原文件
替换
sed "2s#sed#SED#2" sed.txt
2(第二行)s替换#sed(原内容)#SED(替换后内容)#2(第二个找到的---》g代表全部替换)
增加:
sed -i "2a\hello" sed.txt
2(第二行)a(下边增加)\hello(待增加内容)
sed -i "5i\world" sed.txt
5(第5行)i(上边增加)\world(待增加内容)
删除
sed "2(第2行)d(删除)" sed.txt
4 awk 基于行的编辑工具
awk '{print $3,$1}' awk.txt
(打印awk.txt文件中的第3 列和第1列(用空格分割))
内置变量:
FILENAME 文件名
NR 行号:
awk 'NR==2 {print $3}' awk.txt
(只对第二行进行打印操作)
NF 列数:
awk '{print $NF}' awk.txt
(打印最后一列)
FS 指定分割符:
awk 'BEGIN{FS="a"} {print $2}' awk.txt
(用a分割每一行, 更推荐用参数:-F "a")
OFS 指定多个输出时的连接符
awk 'BEGIN{OFS="->"} {print $1,$3}' awk.txt
(打印第1列和第3列并用->连接)
17 分支
1 if分支:
if [ 条件 ]
then
指令1
elif [ 条件2 ]
then
指令2
else
指令3
fi
别忘了fi
2 case分支 ---》一对多的分支判断
case 变量名 in
值1)
指令1
;;(情况1的结束)
...
值n)
指令n
;;
*)
其他情况
;;
esac
18 循环
for循环
for 值 in 列表(一般用命令变量的输出)
do
执行语句
done
while循环(跟python完全一样)
while 条件
do
执行语句
done
19 函数
定义:
函数名() {
函数体
$n 代表第n个函数的参数
$0 永远都是脚本名
}
调用:
函数名 参数1 参数2 。。。。
返回值
return (0~255)
获取返回值:$?
命令变量也适用于函数
20-shell中可执行命令的种类
1 应用程序---》which查到信息
2 脚本-------》 file查到文件类型
3 函数-------》以上两条命令查不到
21 虚拟环境命令们导入方法:
export WORKON_HOME=/root/.venv (定义存储虚拟环境的路径)
source /usr/local/bin/virtualenvwrapper.sh