前端训练营第3节笔记
shell脚本和编程
shell 的历史演变
物理终端 =>软件终端 tty =>终端模拟器 => shell
tty:或者说终端最开始指的是获取用户输入并输出的物理设备, 比如电传打字机
在 linux 中是接收用户输入、输出结果的终端仿真软件,比如我们用的 mac terminal、 iterm2 等,更强输入辅助功能、画面绘制输出的模拟终端器
而 tty变成一个虚拟概念,是linux的一个程序,每个终端模拟器关联一个虚拟tty,和内核打交道,我们可以在 终端模拟器中输入 tty 查看关联到的虚拟 tty
bash是 shell的一种具体实现,可以理解成 实例和类的关系。
即 bash是 sh 的超集,可以直接执行大部分 sh 脚本。 Bash 在兼容 Bourne shell脚本编程的同时,集成了 Kom shell和C shell的功能,包括命令历史,命令行编辑,目录堆栈(pushd 和 popd) ,一些实用环境安量,命令自动补全等。
shell介绍
shell 既是命令解释器也是一门编程语言
shell命令
管道
作用:将前一个命令输出传递给后一个命令输入
注意:1,ls,mv需要 外加 xargs命令预处理,让xargs将输出传递给ls
2,仅处理标准输出stdout,忽略错误输出stderr,需要加set -o pipefail设置遇到管道错误时退出
重定向
每个shell命令在执行的时候都会打开三个文件描述符,0,1,2分别对应标准输入,标准输出,标准错误,其默认指向如图1所示,改变这些描述符指向的行为称为重定向(输入重定向和输出重定向)
图1
图2
图3
注意:2>&中 &必须在>后面
<< 的作用是 右侧为给定一个限定值,在执行到限定值的时候,输出结果
判断命令
利用test、[、[ ]三种判断符号进行判断
可进行 整数、字符串、文件 的测试:
test condition,[codition],[[codition]]
PS:
-
中括号前后要有空格符
-
[ 和 test 是命令,只能使用自己支持的标志位,=、>、< 只能用来比较字符串
-
中括号内的变量,最好都是用引号括起来
-
[[ 更丰富,在整型比较中支持<、>、=,在字符串比较中支持 =~ 正则
例:
-**
即为标志位
整数位:-eq,-lt,-gt分别为判断等于,小于,大于
字符串:-z判断是否为空,-n判断是否非空,=判断是否相等
文件测试:-e 判断文件是否存在;-f判断文件是否存在并为一个普通文件
当$name没有被字符串符号引用会报错,加上字符串就没问题
分支语句
例子:
循环
until跟while循环相反
函数
PS:函数内部定义变量用 local 限定作用域防止污染全局,不用local可以用unset
模块化
source 函数库的路径
常用指令
shell执行过程及原理
shell脚本一般以.sh文件名为结尾,也可以没有,是一个约定
第一行需要指定用什么命令行解释器执行↓
PS:#!是内核识别并选择合适的解释器之后,将文本文件再交给解释器执行
前两种子进程执行,source是当前进程执行
执行过程
1,字符解析。2,shell展开。3,重定向。4,执行命令(内置命令直接执行;非内置命令$PATH查找,找到后用子进程执行)。5,收集状态返回给用户脚本
字符解析
将大段的命令行分段,分别做行的分割,命令的分割,命令和参数的分割。
行的分割:识别 ;和换行符(回车)
命令的分割:识别 && || 和 管道
命令和参数的分割:识别空格和tab符等
shell展开
1,
2,
3,
一、
二、
三、
五、
注意:截取后剩下的部分复制,而不是将截取的部分赋值
(4)
(6)
调试和前端集成
1,echo或printf。2,set命令。3,vscode debug。
前端集成
exec与spawn的区别:exec在子shell执行传入命令,执行结果存入缓冲区,执行完再将缓冲区结果回调,缓冲区有限制,默认为200kb,超过200kb会报错
spawn不会启动子shell,且返回一个流对象,可以直接进行流对象操作,无需缓冲,没有大小限制,适合大数据量的操作