课程要点
- Shell 基础和语法
- Shell 执行过程和原理
- Shell 调试和前端集成
一、Shell 基础和语法
- 变量
变量分为三种类型——自定义变量,环境变量,系统环境变量
- 变量使用
#变量名=变量值(等号左右不能有空格)
page size=1
page num=2
#将命令复制给变量
_1s=1s
#将命令结果赋值给变量
file list=$(1s -a)
#默认字符串,不会进行+运算!!
total=page_size*page_num
#声明变量为整型才可以计算
let total=page size*page_num
declare -i total=page_size*page_num
#导出环境变量
export total
declare -x total
- 系统变量列表
- 运算符
- 管道
管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
语法:cmd1 | cmd2
注意:
管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,需要使用xargs预处理
管道命令仅仅处理标准输出,对于错误会予以忽略,可以使用
set-o pipefail设置shell遇到管道错误退出
- 重定向
- 判断&分支
- if
if condition then
//程序段
elif condition then
//程序段
esle
//程序段
fi
- case
语法2:
case $变量 in:
"第一个变量内容")
//程序段
;;
"第一个变量内容")
//程序段
;;
*)
//程序段
;;
esac
- 循环
# While循环
while [条件];
do
//程序段
done
# Until循环(条件为false时执行)
while [条件];
do
//程序段
done
# for循环
for 变量 in 组;
do
//程序段
done
# 还有经典的for循环
for((i=0;i<10;i++));
do
//程序段
done
- 函数
函数可以之间声明,也可以用function关键字声明,函数直接使用名称调用(无需括号)
printName(){
if [ $# -lt 2 ]then
echo "illegal parameter."
exit 1
fi
echo "firstname is $1"
echo "lastname is:$2"
}
printName jacky chen
使用
source可以做到类似于C++ Include的效果
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,
$0代表函数名,后续参数通过$1、$2获取- 函数内return仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用echo、printf, 在外面使用$()、``获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
二、Shell 执行过程和原理
- 字符解析
识别换行符、分号()做行的分割
识别命令连接符Ⅻ&&管道)做命令的分割
识别空格、tab符,做命令和参数的分割
-
shell展开,例如{1.3}解析为123
-
重定向,将stdin、stdout、stderr的文件描述符进行指向变更
-
执行命令
builtin直接执行 非builtin使用$PATH查找,然后启动子进程执行
- 收集状态并返回
三、Shell 调试和前端集成
- 调试
Shell调试有以下几种方法:
- 普通log,使用echo、printf
- 使用set命令
- vscode debug插件
- 前端集成
- node中通过 exec、spawn调用shell命令
- shell脚本中调用node命令
- 借助zx等库进行javascript、.shell script的融合
-
- 借助shell完成系统操作,文件io、内存、磁盘系统状态
-
- 借助nodejs完成应用层能力,网络io、计算等