Shell脚本和编程
Shell是一种命令行界面,也是一种编程语言, 熟练掌握 Shell 能够大大提升 Unix/Linux环境下的工作效率。
基础概念
概念
终端:获取用户输入,展示运算结果的硬件设备
终端模拟器:Mac Terminal,iTerm2等,关联虚拟tty的输入输出软件
tty:teletypeWriter的简称,和终端等价,早期指电传打印机,在linux中是输入/输出环境 Shell:commana interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端 Bash:Shell的一种体现
发展
构成
语法和命令
变量:
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前Shell | = | 字符串,整形,浮点型,日期型 |
| 环境变量 | 当前Shell及其子Shell | export,declare -x | |
| 系统环境变量 | 所有Shell | 启动加载 |
配置文件加载
如果取得 bash 需要完整的登录流程,我们称之为 login shell,比如 ssh 远程登录一台主机不需要登录的bash 我们称为 non-login bash,比如在原来的 bash 中执行 bash开启子进程、执行一些外部命令如果修改了配置文件,不会立即生效,需要我们重启终端或者执行 source 命令
运算符和引用
管道
重定向
判断命令
分支语句
循环
函数
模块化
常用命令
执行过程和原理
执行
1.shel1脚本一般以.sh 结尾, 也可以没有, 这是一个约定; 第一行需要指定用什么命令解释器来执行
1 #! /bin/bash
1 #! /usr/bin/env bash
2.启动方式
1 #文件名运行
2 ./filename.sh
3
4
5 #解释器运行
6 bash ./filename.sh
7
8
9 # source 运行
10 source ./filename.sh
执行过程
-
字符解析
-
字符解析识别换行符、 分号(;) 做行的分割
-
识别命令连接符(|| && 管道) 做命令的分割
-
识别空格、tab符,做命令和参数的分割
-
-
shell 展开, 例如 {1..3} 解析为 1 2 3
-
重定向,将stdin、stdout、stderr的文件描述符进行指向变更
-
执行命令
-
builtin 直接执行
-
非 builtin 使用 SPATH 查找,然后启动子进程执行
-
-
收集状态并返回
Shell展开
- 大括号展开 (Brace Expansion) [...}
- 波浪号展开 (Tilde Expansion) ~
- 参数展开 (Shell Parameter Expansion)
- 命令替换 (Command Substitution)
- 数学计算 (Arithmetic Expansion) $((..))
- 文件名展开 (Filename Expansion) * ? [..] 外壳文件名模式匹配
调试和前端集成
调试
1.普通log,使用 echo、printf打印输出的东西 2.使用 set 命令
| set配置 | 作用 | 补充 |
|---|---|---|
| -u | 遇到不存在的变量就会报错,并停止执行 | -o nounset |
| -x | 运行结果之前,先输出执行的那一行命令。 | -o xtrace |
| -e | 只要发生错误,就终止执行 | -o errexit |
| -o pipefail | 管道符链接的,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行 |
3.vscode debug插件
- shellman:代码提示和自动补全
- shellcheck:代码语法校验
- shel1-format:代码格式化
- Bash Debug: 支持单步调试
- 安装 vscode 插件
- 编写 launch.json文件
- 升级 bash 到 4.x 以上版本
前端集成
- node中通过 exec、spawn 调用 shell 命令
- shell 脚本中调用 node 命令
- 借助 x 等库进行javascript、 shell script 的融合
- 借助 shell 完成系统操作,文件io、内存、磁盘系统状态查询
- 借助 nodejs 完成应用层能力, 网络io、计算等