自动化运维
一天半---》shell语法 运行机制 常见应用
一天半---》实现一个代码发布的案例
1 shell
1运维简介:
除了功能开发之外的所有活动都跟运维有关
2 自动化运维:
自动化实现运维活动
一般用shell脚本实现自动化
3 shell就是命令解释
位于应用程序和操作系统之间
4 shell分类:
一般而言:shell就是命令行shell(linux下shell(bash))
5 查看当前系统shell版本
echo $SHELL
6 查看系统兼容性支持的shell类型们:
cat /etc/shells
7 shell脚本:
命令放到文件中执行,该文件称为shell脚本
8 脚本创建
1 用记事本写(要求用vim)
2 脚本命名:1 名称有意义 2 .sh结尾
3 脚本内容:首行要指定脚本解释器
4 注释:单行注释和python一样,多行注释::<
9 脚本执行
1 bash 脚本名(启动子shell,在子shell中执行脚本内命令)
2 ./脚本名 (启动子shell(名字叫脚本名), 在子shell中执行脚本内命令)
3 source 脚本名(类似python import 模块) (直接在当前shell内执行脚本内命令)
10 开发规范
1 不要用中文注释
2 成对内容一次性写
3 适当缩进(仿照python风格)
11 变量定义
普通变量
1 变量名=变量值 (变量值不能有特殊字符)
2 变量名='变量值' (变量值作为整体赋值)
3 变量名="变量值" (变量套变量)
命令变量(将命令的输出作为变量值赋给变量名)
变量名=`命令`
变量名=$(命令)
变量值不会随着命令输出的改变而改变
12 变量访问
1 $变量名
2 "$变量名" (保证变量值是字符串)
3 ${变量名} (限定变量名访问)
4 "${变量名}" (推荐形式)
unset 变量名 (删除变量)
13 变量分类:
本地变量(哪里定义哪里访问)
全局变量(环境变量)
1 查看当前全局变量:
env
2 定义:
变量名=值
export 变量
(先定义后转换)
export 变量名=值 (二合一)
3 生效范围
当前shell和子shell(子shell继承父shell的全局变量)
若想让所有环境生效:
1 修改~/.bashrc (只对当前用户生效,source执行该文件或重新打开新shell生效)
2 修改/etc/profile (所有用户都生效,source执行该文件或重启生效)
内置变量
1脚本相关
$0 当前脚本名
$$ 指向该脚本的进程号
$n 脚本的第n个参数(脚本传参:脚本名 s g b )
$# 参数个数
$? 上一条命令是否执行成功(0-成功,非0-失败,,若上一条命令是执行脚本,则获取脚本最后一条命令的返回值)
2 字符串截取
${变量名:起始位置:截取长度}
(倒着截要写0-X)
3 默认值
${变量名:-默认值} (若变量不存在则输出默认值)
${变量名:+提示信息} (若变量存在则输出提示信息)
14 表达式
逻辑转成控制
1 测试语句
test 条件
[ 条件 ] (括号内侧两边各有一个空格)
1 数值比较 (比较操作符两边各有一个空格)
n1 -eq n2 相等
n1 -gt n2 大于
n1 -ge n2 大于等于
n1 -lt n2 小于
n1 -le n2 小于等于
n1 -ne n2 不等于
2 字符串比较
== != (两边有空格)
2 逻辑表达式
命令1 && 命令2 (1成功则执行2)
命令1 || 命令2 (1失败则执行2)
3 文件表达式
-f 判断是否是文件
-d 判断是否是目录
-x 判断是否有可执行权限(目录可执行)
4 计算表达式
$((计算过程))
let 等式
15 常见符号
1 重定向
应用程序的输出:
1标准输出(正常执行时的输出)
2标准错误(异常执行时的输出)
分别重定向:
bash 6-chongdingxiang.sh > res.log 2> err.log
合并重定向:
bash 6-chongdingxiang.sh > res.log 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 *chong*
(在当前目录以及子目录查找名称大概是chong的文件)
3 sed
-i参数代表修改源文件
替换:
sed -i "2s#sed#SED#1" sed.txt
("2(第二行)s替换#sed(原内容)#SED(替换后内容)#1(第1个找到的做替换---》g代表全部替换)")
增加:
sed "2a\hello" sed.txt
"2(第二行)a(下方增加)\hello(增加的内容)"
sed "4i\world" sed.txt
"4(第四行)i(上方增加)\world(增加的内容)"
删除:
sed "3(第三行)d(删除)" sed.txt
4 awk
awk '{print $1,$3}' awk.txt
打印awk.txt文件中每一行的第1列和第3列,并且用空格分割
内置变量:
FILENAME:文件名
NR:行号
awk 'NR==2 {print $2}' awk.txt
(只处理第2行)
NF:列数
awk '{print $NF}' awk.txt
(打印最后一列)
FS:指定行分隔符
awk 'BEGIN{FS="awk"} {print $3}' awk.txt
(指定行分隔符为awk)
awk -F "awk" ' {print $3,$1}' awk.txt
(-F 更常用)
OFS:指定多个输出的连接符
awk -F "awk" 'BEGIN{OFS="->"} {print $3,$1}' awk.txt
(指定第三列和第一列直接的连接符是->)