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

54 阅读3分钟

shell

一、学习shell的价值

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

二、shell概念

1、概念

2、 构成

Snipaste_2023-04-18_20-09-08.png

三、命令和语法

1、变量

Snipaste_2023-04-18_20-10-56.png

2、自定义变量

Snipaste_2023-04-18_20-12-47.png Snipaste_2023-04-18_20-13-46.png

3、系统环境变量

Snipaste_2023-04-18_20-14-32.png

4、配置文件加载

Snipaste_2023-04-18_20-17-17.png

修改了某配置文件,需要执行source ~/.bashrc才可生效

5、运算符和引用

Snipaste_2023-04-18_20-20-49.png

6、管道

管道与管道符 |,作用是将前一个命令结果传递给后面的命令

语法: cmd1 | cmd2

要求:管道右侧的命令必须能接受标准输入才行,比如 grep 命令, ls、mv等不能直接使用,可以使用xargs 预处理

Snipaste_2023-04-18_20-25-27.png

7、重定向

Snipaste_2023-04-18_20-27-37.png

Snipaste_2023-04-18_20-29-36.png

Snipaste_2023-04-18_20-30-36.png

8、判断命令

shell中提供了test、[.[[三种判断符号,可用于:

  • 整数测试
  • 字符串测试
  • 文件测试

语法:

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

Snipaste_2023-04-18_20-35-23.png

注意:

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

Snipaste_2023-04-18_20-37-16.png

9、分支语句

Snipaste_2023-04-18_20-40-43.png

Snipaste_2023-04-18_23-08-36.png Snipaste_2023-04-18_23-09-00.png

10、循环

Snipaste_2023-04-18_23-09-24.png

11、函数

Snipaste_2023-04-18_23-11-18.png

Snipaste_2023-04-18_23-12-16.png 注意:

  • shell自上而下执行,函数必须在使用前定义
  • 函数获取变量和 shell script类似,O代表函数名,后续参数通过O代表函数名,后续参数通过1、$2 ...获取
  • 函数内return仅仅表示函数执行状态,不代表函数执行结果
  • 返回结果一般使用echo、 printf,在外面使用$() 、“”获取结果
  • 如果没有return ,函数状态是上一条命令的执行状态,存储在$?中

12、模块化

模块化的原理是在当前shell内执行函数文件,方式:source【函数库的路径】

Snipaste_2023-04-18_23-22-20.png

13、常用命令

Snipaste_2023-04-18_23-22-59.png

四、执行过程和原理

1、执行

  • shell脚本一般以.sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行

Snipaste_2023-04-18_23-28-40.png

  • 启动方式

Snipaste_2023-04-18_23-28-55.png

2、执行过程

2.1字符解析

  • 识别换行符、分号(﹔)做行的分割

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

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

Snipaste_2023-04-18_23-32-02.png

2.2、shell展开,例如{1..3}解析为1 23

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

2.4、执行命令

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

3、shell展开

  • 大括号展开(Brace Expansion){.. .}

    一般由三部分构成, 前缀、一对大括号、后缀, 大括号内可以是逗号分割的字符串序列,也可以是序列表达式{x..y ..incr]J !

  • 波浪号展开(Tilde Expansion)~

  • 参数展开(Shell Parameter Expansion )

    1)间接参数扩展!parameter,其中引用的参数并不是parameter而是parameter的实际的值2)参数长度{ ! parameter} ,其中引用的参数并不是parameter而是parameter的实际的值 2)参数长度{ #parameter} 3)空参数处理 {parameter: -word}#为空替换 { parameter: =word}#为空替换,并将值赋给$parameter变量

    { parameter: ?word}#为空报错 { parameter: +word}#不为空替换 4)参数切片 parameter:offset{ parameter: offset} { parameter: offset: length} 5)参数部分删除 ${ parameter%word} # 最小限度从后面截取word

    $parameter%%word} #最大限度从后面截取word

    ${ parameter#word}#最小限度从前面截取word

    ${ parameter##word} #最大限度从前面截取word

  • 命令替换(Command Substitution)

    在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种: $(...)或`...

  • 数学计算(Arithmetic Expansion)$(( ..))

    使用$(())包裹数学运算表达式,得到结果并替换

  • 文件名展开(Filename Expansion) * ?[..]外壳文件名模式匹配

    当有单词没有被引号包裹,且其中出现了‘*’,‘?’, and‘[’字符,则shell 会去按照正则匹配的方式查找文件名进行替换,如果没找到则保持不变

五、调试和前端集成

1、调试

  • 普通log,使用echo. printf

  • 使用set命令

  • vscode debug插件

Snipaste_2023-04-18_23-45-16.png

2、VSCode配置

  • shellman:代码提示和自动补全

  • shellcheck:代码语法校验

  • shell-format:代码格式化

  • Bash Debug:支持单步调试

    安装vscode插件 编写launch.json文件 升级bash到4.x以上版本

3、前端集成

3.1node中通过exec. spawn调用shell命令

3.2shell脚本中调用node命令

3.3借助zx等库进行javascript. shell script的融合

  • 借助shell完成系统操作.文件io、内存、磁盘系统状态查询等
  • 借助nodejs 完成应用层能力.网络io、计算等