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

70 阅读2分钟

目录

Shell基础概念

命令和语法

执行过程和原理

调试和前端集成

字符解析

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

识别命令连接符(H&&管道做命令的分割

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

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

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

执行命令

builtin直接执行

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

收集状态并返回

变量

shell中的变量类型 

自定义变量

环境变量

系统环境变量

类型 作用域

自定义变量 当前shell

环境变量 当前shell及其子shell

环境变量 当前shell及其子shell

声明方式 规范

= 字符串、整型、浮点型、日期型

export、declare -x 

启动加载

父子shell

当父进程在第三方或核心工具时会启动子进程去执行,执行完后交还给父进程,父进程再继续执行下一条命令

自定义变量

#变量名=变量值(等号左右不能有空格)

page_size=1

page_num=2

#将命令复制给变量

_ls=ls

#将命令结果赋值给变量

file_list=$(ls -a)

#默认字符串,不会进行 + 运算

shell 展开

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

波浪号展开(Tilde Expansion) ~

参数展开(Shell Parameter Expansion)

命令替换(Command Substitution)

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

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

调试和前端集成

vscode配置

1.shellman:代码提示和自动补全

2.shellcheck:代码语法校验

3.shell-format:代码格式化

前端配置

node中通过exec、spawn调用shell命令

shell脚本中调用node命令

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

借助shell完成系统操作,文件io、内存、磁盘系统状态查询

一借助nodejs完成应用层能力,网络io、计算等

系统环境变量

$0:表示当前执行的脚本或命令的名称

$#:表示命令或脚本要处理的参数的个数

$*:把所有的参数看成以空格分隔的一个字符串整体(单字符串)返回

$?上条命令执行的状态码

$PS1命令提示符

$HOME用户主文件夹

$PATH全局命令的搜索路径

运算符和引用

类型: 算数运算符 逻辑运算符 比较运算符 引号 圆括号 命令连接 后台运行

管道 

Linux 管道使用竖线|连接多个命令,这被称为管道符。Linux 管道的具体语法格式如下: cmd1|cmd2

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

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

输入重定向符号“<” ,“<<”

输出重定向符号“>”,“>>”,“2>”,“&>”

判断命令 

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

整数测试

字符串测试

文件测试

语法

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

分支语句

shell中分支语句主要是两种: 

if语句

if语句经常用在分支不是很多的场景下,if后面的指令,首先会被执行,然后根据指令的返回状态码进入对应的分支。如果状态码为0,也就 是指令执行成功,就进去then的部分;非0则进入其他分支。

VSCode配置

插件

shellman:代码提示和自动补全

shellcheck:代码语法校验

shell-format:代码格式化

总结:Shell编程是一种在Linux系统中常用的脚本语言,它可以通过编写一些简单的脚本来完成一些复杂的任务。这节课我们从执行、配置加载、解析过程、语法的顺序去回忆知识脉络,去复习也是很方便的,有多的时间还可以去拓展,了解更多。