今天学习的是 Shell 编程。
前端程序员学习 Shell 的价值:
- Linux 服务器的基本操作和管理
- 前端 Node.js 服务进程管理、问题排查、资源监控等运维操作
- 使用 Shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署
课程结构:
- Shell 基本概念
- 命令和语法
- 执行过程和原理
- 调试和前端集成
Shell 基本概念
理清几个关键词之间的区别:
- 终端:获取用户输入,展示运算结果的硬件设备
- tty:teletypeWriter 的简称,与终端等价,早期指电传打印机,在 Linux 当中是输入/输出环境
- 终端模拟器:Mac Terminal、iTerm2 等,关联虚拟 tty 的输入输出设备
- Shell:command interpreter(命令解释器),处理来自终端模拟器的输入,解释执行之后输出结果给终端
- Bash:Shell的一种具体实现
Shell 和 Bash 的关系可以类似于类和对象实例的关系。
Shell 不仅仅是命令解释器,也是一种编程语言。
语法和命令
要知道的是,Shell 当中声明变量,等号两边是不需要空格的,加了空格反而会错。
login shell 和 non-login shell 加载的流程区别如下。
login shell 和 non-login shell 的区别:
- login shell 是登录系统时获得的顶层 Shell,或者使用 -login 选项调用 bash 的 Shell。
- non-login shell 是在已经登录的系统之中再启动的 Shell,比如在终端之中输入 bash 或者 zsh 命令。
先来解释一下curl命令的作用:是发出网络请求,然后得到和提取数据,显示在标准输出上面。
curl命令的具体用法:curl 的用法指南
管道
管道符是 |,作用是将前一个命令结果传递给后面的命令。
语法:cmd1 | cmd2
此处cmd1运行的结果会传递给cmd2。
要求:管道右侧命令必须能够接受标准输入才可以,比如grep,ls、mv都不能直接使用,但是可以使用xargs预处理。
分支语句
if condition; then
程序段
elif condition; then
程序段
else
程序段
fi
case $变量 in:
"第一个变量内容")
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
;;
esac
三种循环
- while循环
while condition ; do 程序段; done
- until循环
until condition ; do 程序段; done
- for循环
for var in [words...]; do 程序段; done
函数的写法
- 语法1:
funcName(){echo "abc";} - 语法2:
function funcName(){echo "abc";}
注意事项:
- Shell 自上而下执行,函数必须在使用前定义
- 函数获取变量和 Shell script 类似,1、$2...获取
- 函数内 return 仅仅表示函数的执行状态,不代表函数的执行结果
- 函数返回结果一般用 echo、printf,在外面使用 $()、``获取结果
- 如果没有 return,函数状态是上一条命令的执行状态,存储在 $? 当中
Shell 的模块化
模块化的原理是在当前 Shell 内执行函数文件,方式:source [函数库的路径]。
执行过程和原理
Shell 脚本一般以 .sh 结尾,第一行用来指定用什么命令解释器进行执行。
#! /bin/bash
#! /usr/bin/env bash
上面就指定了用 bash 命令解释器进行执行。 下面是几种运行脚本的方式。
# 文件名执行(前提是用户需要有可执行权限)
./filename.sh
# 解释器执行
bash ./filename.sh
# source 运行
source ./filename.sh
前两种方式会在子进程当中执行脚本,最后一种是在当前进程执行脚本。
执行过程
1、字符解析
- 识别换行符、分号(;)做行的分割
- 识别命令连接符(|| && 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
2、Shell 展开
3、重定向,将 stdin、stdout、stderr 的文件描述符进行指向变更
4、执行命令
- builtin 直接执行
- 非 builtin 使用 $PATH 查找,然后启动子进程执行
5、收集状态并返回
调试和前端集成
1、普通 log,使用echo、printf
2、使用 set 命令
3、vscode debug 插件
vscode 配置
- shellman:代码提示和自动补全
- shellcheck:代码语法校验
- shell-format:代码格式化
- Bash Debug:支持单步调试
1、安装 vscode 插件
2、编写 launch.json 文件
3、升级 bash 到 4.x 以上版本
前端集成
1、node 中通过 exec、spawn 调用 shell 命令
2、shell 脚本中调用 node 命令
3、借助 zx 等库进行 javascript、shell script 的融合
-
借助 shell 完成系统测试,文件 io,内存,磁盘系统状态查询等
-
借助 nodejs 完成应用层能力,文件 io,计算等