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

110 阅读2分钟

1 shell基础概念

1.1 概念

终端:获取用户输入、展示运算结果的硬件设备
tty:teletypeWriter的简称,和终端等价,早期指电传打印机,在Linux中是输入/输出环境
终端模拟器:关联虚拟器tty的输入输出软件
Shell:处理来自终端模拟器的输入,解释执行之后的输出结果给终端
Bash:shell的一种具体实现

1.2 构成

image.png

2 命令和语法

2.1 自定义变量

image.png

image.png

2.2 系统环境变量

image.png

2.3 配置文件加载

image.png

使用source ~/.bashrc使文本生效

2.4 运算符和引用

image.png

2.5 管道

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

语法:cmd1|cmd2

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

注意:管道命令进处理stdout,对于stderr会予以忽略,可以使用set —o pipefail设置shell遇到管道错误退出

2.6 重定向

输出重定向符号

| >:覆盖写入文件 | >>:追加写入文件 | 2>:错误输出写入文件 | &>:正确和错误输出统一写入到文件中

输入重定向符号

| < | <<

2.7 判断命令

语法:

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

整数测试

  • -eq “=”
  • -lt “<”
  • -gt “>”

字符串测试

  • -z 字符串为空
  • -n 判断字符串非空

文件测试

  • -e 判断文件是否存在
  • -f 判断文件是否存在并且为普通文件

2.8 分支语句

image.png

2.9 循环

while循环:

  • while condition ;do 程序段; done

until循环: -until condition;do 程序段; done

for循环: -for var in [words...];do 程序段; done

2.10 函数

语法一:funcName(){ echo "abc"; }

语法二:funcName(){ echo "abc"; }

2.11 模块化

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

3 执行过程和原理

3.1 执行

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

2、启动方式

  • 文件名运行:./filename.sh
  • 解释器运行:bash ./filename.sh
  • source运行:source ./filename.sh

3.2 执行过程

1、字符解析 -识别换行符、分号(;)做行的分割 -识别命令连接符(||&&管道)做命令的分割 -识别空格、tab符、做命令和参数的分割

2、shell展开,例如(1..3)解析为1 2 3

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

4、执行命令 -builtin直接执行 -非builtin使用$PATH查找,然后启动子进程执行

3.3 shell展开

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

波浪号展开:被替换成当前用户的主目录的值

参数展开 ${}

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

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

4 调试和前端集成

4.1 调试

1、普通log,使用echo、printf

2、使用set命令

3、vscode debug插件

4.2 前端集成

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

2、shell脚本中调用node命令

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