Shell 脚本和编程
学习 shell 的价值:
- Linux 服务器的基本操作和管理
- 前端 Node.js 服务的进程管理、问题排查、资源监控等运维操作
- 使用 shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署
课程准备
• 一台安装了 linux 系统的物理机或者云主机,可运行 shell 脚本
• 本地的 vscode 安装 Bash Debug 插件, 并升级 bash 到 4.x 以上
• Npm 全局安装 zx 依赖
Shell 基础概念
概念
终端
- 获取用户输入、展示运算结果的硬件设备
终端模拟器
- Mac Terminal、 iTerm2等, 关联虚拟 tty 的输入输出软件
tty
- teletypeWriter的简称, 和终端等价,早期指电传打印机, 在linux 中是 输入/输出 环境
Shell
- command interpreter, 处理来自终端模拟器的输入, 解释执行之后输出结果给终端
Bash
- shell的一种具体实现
发展
-
Ken Thompson(来自贝尔实验室)在 1971 年为 UNIX开发了第一个 shell,称为 V6 shell
-
Stephen Bourne 在贝尔实验室 为 V7 UNIX 所开发的 Bourne shell , 即 sh
-
开源组织 GNU 为了取代 Bourne shell 开发的Bourne-Again shell, 即 Bash
构成
主要由编程语言和解释器组成
- 解释器
- bash内置命令
- GNU核心工具集
- 第三方库
- 编程语言
-变量
- 运算
- 语句
- 函数
语法和命令
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前shell及其子shell | export、declare -x | |
| 系统环境变量 | 所有shell | 启动加载 |
自定义变量
系统环境变量
运算符的引用
管道
管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
语法:
cmd1 | cmd2
要求: 管道右侧的命令必须能接受标准输入才行, 比如 grep 命令, ls、mv等不能直接使用,可以使用 xargs 预处理
注意: 管道命令仅仅处理 stdout, 对于 stderr 会予以忽略, 可以使用 set -o pipefail 设置 shell 遇到管道错误退出
重定向
输出重定向符号
>:覆盖写入文件
>>:追加写入文件
2>:错误输出写入文件
&>:正确和错误输出统一写入到文件中
输入重定向符号
<
<<
常用命令
| 命令 | 使用 |
|---|---|
| grep | 查找错误日志:grep -n "ERROR" -A3 -B3 cloudfun.log 统计次数: grep -n "ERROR" -c cloudfun.log |
| sort | 指定分隔符后以第三列进行排序: sort -t " " -k 3 |
| wc | 统计出现的行数、单词数、字符数 wc -lwm |
| head | 查看前十行: head -n 10 cloudfun.log |
| tail | 等待追加内容: tail -f -n 10 cloudfun.log |
| cut | 对数据行的内容进行处理 cut -d " " -f 3 |
| find | 文件和目录查找 |
| xargs | 参数处理 |
| which | 查找命令路径 |
调试和前端集成
调试
1. 普通log, 使用 echo、printf
2. 使用 set 命令
3. vscode debug插件
VSCode 配置
1. shellman: 代码提示和自动补全
2. shellcheck: 代码语法校验
3. shell-format: 代码格式化
4. Bash Debug: 支持单步调试
- 安装 vscode 插件
- 编写 launch.json文件
- 升级 bash 到 4.x 以上版本
前端集成
1. node中通过 exec、spawn 调用 shell 命令
2. shell 脚本中调用 node 命令
3. 借助 zx 等库进行 javascript、 shell script 的融合
- 借助 shell 完成系统操作, 文件io、内存、磁盘系统状态查询等
- 借助 nodejs 完成应用层能力, 网络io、计算等