Shell脚本编程 | 青训营笔记

76 阅读2分钟

课程要点

  1. Shell 基础和语法
  2. Shell 执行过程和原理
  3. Shell 调试和前端集成

一、Shell 基础和语法

  • 变量

变量分为三种类型——自定义变量,环境变量,系统环境变量

image.png

  • 变量使用
#变量名=变量值(等号左右不能有空格)
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
  • 系统变量列表

image.png

  • 运算符

image.png

  • 管道

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

语法:cmd1 | cmd2

注意:

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

管道命令仅仅处理标准输出,对于错误会予以忽略,可以使用set-o pipefail设置shell遇到管道错误退出

  • 重定向

image.png

  • 判断&分支
    • 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的效果

  1. shell自上而下执行,函数必须在使用前定义
  2. 函数获取变量和shell script类似,$0代表函数名,后续参数通过$1$2获取
  3. 函数内return仅仅表示函数执行状态,不代表函数执行结果
  4. 返回结果一般使用echo、printf, 在外面使用$()、``获取结果
  5. 如果没有return,函数状态是上一条命令的执行状态,存储在$?中

二、Shell 执行过程和原理

  1. 字符解析

识别换行符、分号()做行的分割

识别命令连接符Ⅻ&&管道)做命令的分割

识别空格、tab符,做命令和参数的分割

  1. shell展开,例如{1.3}解析为123

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

  3. 执行命令

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

  1. 收集状态并返回

三、Shell 调试和前端集成

  • 调试

Shell调试有以下几种方法:

  1. 普通log,使用echo、printf
  2. 使用set命令
  3. vscode debug插件
  • 前端集成
  1. node中通过 exec、spawn调用shell命令
  2. shell脚本中调用node命令
  3. 借助zx等库进行javascript、.shell script的融合
    • 借助shell完成系统操作,文件io、内存、磁盘系统状态
    • 借助nodejs完成应用层能力,网络io、计算等