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

135 阅读3分钟

Shell脚本和编程

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

基础概念

概念

终端:获取用户输入,展示运算结果的硬件设备

终端模拟器:Mac Terminal,iTerm2等,关联虚拟tty的输入输出软件

tty:teletypeWriter的简称,和终端等价,早期指电传打印机,在linux中是输入/输出环境 Shell:commana interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端 Bash:Shell的一种体现

发展

image-1.png

构成

image-2.png

语法和命令

变量:

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

配置文件加载

image-3.png 如果取得 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

执行过程

  1. 字符解析

    • 字符解析识别换行符、 分号(;) 做行的分割

    • 识别命令连接符(|| && 管道) 做命令的分割

    • 识别空格、tab符,做命令和参数的分割

  2. shell 展开, 例如 {1..3} 解析为 1 2 3

  3. 重定向,将stdin、stdout、stderr的文件描述符进行指向变更

  4. 执行命令

    • builtin 直接执行

    • 非 builtin 使用 SPATH 查找,然后启动子进程执行

  5. 收集状态并返回

image-4.png

Shell展开

  1. 大括号展开 (Brace Expansion) [...}
  2. 波浪号展开 (Tilde Expansion) ~
  3. 参数展开 (Shell Parameter Expansion)
  4. 命令替换 (Command Substitution)
  5. 数学计算 (Arithmetic Expansion) $((..))
  6. 文件名展开 (Filename Expansion) * ? [..] 外壳文件名模式匹配

调试和前端集成

调试

1.普通log,使用 echo、printf打印输出的东西 2.使用 set 命令

set配置作用补充
-u遇到不存在的变量就会报错,并停止执行-o nounset
-x运行结果之前,先输出执行的那一行命令。-o xtrace
-e只要发生错误,就终止执行-o errexit
-o pipefail管道符链接的,只要一个子命令失败,整个管道命令就失败,脚本就会终止执行

3.vscode debug插件

  1. shellman:代码提示和自动补全
  2. shellcheck:代码语法校验
  3. shel1-format:代码格式化
  4. Bash Debug: 支持单步调试
    • 安装 vscode 插件
    • 编写 launch.json文件
    • 升级 bash 到 4.x 以上版本

前端集成

  1. node中通过 exec、spawn 调用 shell 命令
  2. shell 脚本中调用 node 命令
  3. 借助 x 等库进行javascript、 shell script 的融合
  4. 借助 shell 完成系统操作,文件io、内存、磁盘系统状态查询
  5. 借助 nodejs 完成应用层能力, 网络io、计算等

总结

image-5.png