Shell 脚本和编程 | 青训营笔记

98 阅读3分钟

前言:

Shell是一种命令行界面,也是一种编程语言, 熟练掌握 Shell 能够大大提升 Unix/Linux环境下的工作效率。

重点内容:

  • Shell 基础和语法
  • Shell 执行过程和原理
  • Shell 调试和前端集成

详细知识点:

Shell 应用场景:

  1. Linux 服务器的基本操作和管理
  2. 前端 Node.js 服务的进程管理、问题排查、资源监控等运维操作
  3. 使用 shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署

shell 概念:

  1. 终端: 获取用户输入、展示运算结果的硬件设备
  2. tty:和终端等价
  3. 终端模拟器:关联虚拟 tty 的输入输出软件
  4. shell:处理来自终端模拟器的输入,解释执行之后输出结果给终端
  5. Bash:shell 的一种具体实现

shell 构成:

  • shell 除了提供与内核和设备交互的方法外,还集成了一些软件开发的通用设计模式,具备控制流程,循环,变量,命令查找的机制。
  • 它既是命令解释器,也是编程语言,作为命令解释器,提供给用户接口,使用丰富的 GNU 工具集,第三方或内置的,如 cd、pwd 等

变量:

类型作用域声明方式规范
自定义变量当前 shell=字符串、整型、浮点型、日期型
环境变量当前 shell 及其子 shellexport、declare -x
系统环境变量所有 shell启动加载

自定义变量:

declare 选项 变量

选项含义
-给变量设置类型属性
+取消变量的类型属性
-a将变量声明为数组类型
-i变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p显示指定变量的被声明的类型

系统环境变量:

变量名含义常见操作
$o当前 shell 名称11、2等可以获取到传入参数
$#传入脚本的参数数量if [$# -gt1]
$*传入脚本的所有参数
$?上条命令执行的状态码if [$? -eq o]
$PS1命令提示符export PS1="\u@\h\w>"
$HOME用户主文件夹cd ~
$PATH全局命令的搜索路径PATH=$PATH:[新增路径]

配置文件加载:

管道:

管道与管道符 | ,作用是把前一个命令的结果传递给后面的命令
语法: cmd1 | cmd2 要求:管道右侧的命令必须能接受标准输入,ls、mv等不能直接使用,可以用 xargs 预处理 注意事项:管道命令只能处理 stdout,对 stderr 会忽略,可以用 set -o pipefail 设置 shell 遇到管道错误退出

判断命令:

shell 提供了 test、[]、[[ ]]三种判断符号,可用于:整数、字符串、文件测试 语法:

  • test condition
  • [ condition ]
  • [[ condition ]]

注意事项:

  • 中括号前面需要有空格符
  • []和 test 是命令,只能使用自己支持的标志位,<、>、= 只能用来比较字符串
  • 中括号内的变量,最好都用引号括起来
  • [[]] 更丰富,在整型比较中支持<、>、=,字符串比较支持=~正则

执行过程:

  1. 字符解析:识别符号,做不同的分割
  2. shell 展开
  3. 重定向,将 stdin、stdout、stderr的文件描述符进行指向变更
  4. 执行命令
  5. 收集状态并返回

调试:

  1. 普通log,使用 echo、printf
  2. 使用 set 命令
  3. vscode debug插件

配置:

  1. shellman:代码提示和自动补全
  2. shellcheck:代码语法校验
  3. shell-format:代码格式化
  4. Bash Debug:支持单步调试

前端集成:

  1. node 中通过exec、spawn 调用 shell 命令
  2. shell 脚本中调用 node 命令
  3. 借助 zx 等库,进行js、shell script的融合