学习shell的价值
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
课程准备
- 一台安装了 Linux系统的物理机或者云主机,可以运行shell脚本
- 本地的vscode安装Bash Debug插件,并升级bash到4.x以上
- npm全局安装zx依赖
01 Shell基本概念
01_ 构成
- shell:解释器,编程语言
- 解释器:bash内置命令,GUN核心工具集,第三方库
- 编程语言:变量,运算,语句,函数
02 命令和语法
02_ 自定义变量
#!/bin/bash
#变量名=变量值(等号左右不能有空格)
page_size=1
page_num=2
#将命令复制给变量
_ls=ls
#将命令结果赋值给变量
file_list=${ls -a}
#默认字符串,不会进行+运算
#声明变量为整型
let total=page_size*page_num
#导出环境变量
export total
declare -x total
02_ 配置文件加载
- login-shell
- non-login-shell
第一种shell是用户登录时打开的shell,而第二种是登录之后打开的shell。其中国非登录式shell还可分为交互式和非交互式,交互式就是普通模式,非交互式就是用sh打开某个文件的shell
02_ 重定向
- >:覆盖写入文件
- >>:追加写入文件
- 2>:错误输出写入文件
- &>:正确和错误输出统一写入到文件中
02_ 分支语句
语法1:
if condition ; then
程序段
elif condition ; then
程序段
esle
程序段
fi
语法2:
case $变量 in:
"第一个变量内容")
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
esac
02_ 函数
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,1,$2...获取
- 函数内return仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用echo,printf,在外面使用$(),``获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
03 执行过程和原理
03_执行过程
- 字符解析
- 识别换行符、分号做行的分割
- 识别命令连接符(|| && 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
- shell展开,例如{1..3}解析为1 2 3
- 重定向,将stdin,stdout,stderr的文件描述符进行指向变更
- 执行命令
- builtin直接执行
- 非builtin使用$PATH查找,然后启动子进程执行
- 收集状态并返回
04 调试和前端集成
04_ 调试
- 普通log,使用echo、printf
- 使用set命令
- vscode debug插件
04_ Vscode配置
- shellman:代码提示和自动补全
- shellcheck代码语法检验
- shell-format:代码格式化
- Bash Debug:支持单步调试
- 安装vscode插件
- 编写launch.json文件
- 升级bash到4.x以上版本
04_ 前端集成
- node中通过exec、spawn调用shell命令
- shell脚本中调用node命令
- 借助zx等库进行js、shell script的融合
- 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
- 借助nodejs完成应用层能力,网络io、计算等
总结
通过本节课程,了解了shell的基本概念和语法使用,发现里面有些操作和js挺像的,比如var,let(ES6的let估计就是直接借鉴shell里面的吧),虽然没什么基础,但感觉上手应该是没什么问题的。