学习Shell的价值
- Linux服务器的基本操作和管理
- 前端Node.js服务的进程管理、问题排查、资源监控等运维操作
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署
准备
- 一台安装了Linux系统的物理机或者云主机,可运行shell脚本
- 本地的vscode安装Bash Debug插件,并升级bash到4.x以上
- Npm全局安装zx依赖
1.Shell基础概念
概念
Shell和Bash的关系可以理解成类和实例的关系
发展
构成
语法和命令
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前shell及其子shell | export 、declare -x | |
| 系统环境变量 | 所有shell | 启动加载 |
自定义变量只能在父进程中用到,环境变量和系统环境变量在父进程和子进程中都可以使用
自定义变量
#!/bin/bash
#变量名=环境名(等号左右不能空格)
page_size=1
page_num=2
#将命令复制给变量
_ls=ls
#将命令结果赋值给变量
file_list=$(ls -a)
#默认字符串,不糊进行 + 运算
total=page_size*page_num 错错错
#声明变量为整型
let total=page_size*page_num
declare -i total=page_size*page_num
#导出环境变量
export total
declare -x total
系统环境变量
配置文件加载
修改了某个配置文件时,想让他在当前配置文件运行执行source ~/。bashrc
运算符和引用
管道
重定向
判断命令
例子:
要用双引号包裹
分支语句
语法1:if condition ;then
程序段
elif condition ;then
程序段
else
程序段
fi
连续判断
语法2:
case $变量 in:
"第一个变量内容”)
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
;;
esac
循环
- while循环
while condition ; do 程序段; done
- until循环
until condition ; do 程序段;done
- for 循环
for var in [words]; do 程序段;done
函数
语法一:funcName(){echo "abc";}
语法二:funcName(){echo "abc";}
注意:
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,1、$2...获取
- 函数内return 仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用echo、printf, 在外面使用$() 、 ``获取结果
- 如果没有return ,函数状态时上一条命令的执行状态,存储在$?中
模块化
常用命令
执行过程和原理
执行
- shell脚本一般以 . sh结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
1.#! /bin/bash
1 #! /usr/bin/env bash
2.启动方式
# 文件名运行
./filename.sh
#解释器运行
bash ./filename.sh
#source 运行
source ./filename.sh
执行过程
shell展开
- 大括号展开 (Brace Expansion){...}
- 波浪号展开(Tilde Expansion)~
- 参数展开(Shell Parameter Expansion)
- 命令替换(Command Substitution)
- 数学计算(Arithmetic Expansion)$((..))
- 文件名展开(Filename Expansion) * ? [..] 外壳文件名模式匹配
大括号展开 (Brace Expansion){...}
一般由三部分构成,前缀,一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式{x..y[..incr]}
波浪号展开(Tilde Expansion)~
参数展开(Shell Parameter Expansion)
- 间接参数扩展
- 参数长度
- 空参数处理
- 参数部分删除
命令替换(Command Substitution)
数学计算(Arithmetic Expansion)$((..))
文件名展开(Filename Expansion) * ? [..] 外壳文件名模式匹配
调试和前端集成
调试
- 普通log,使用echo、printf
- 使用set命令
- vscode debug插件
vscode配置
前端集成
exec和spawn的区别:
在 Node.js 中,exec() 和 spawn() 都是用于执行命令行命令的方法,但在使用方式和性能方面有所不同。
- exec() 方法:
exec() 方法是异步执行命令的最简单方法之一,它默认执行 shell 的命令,并在 callback 函数中返回缓冲区输出。exec() 允许执行任何 shell 命令,而不仅限于 Node.js 环境下支持的命令。exec() 方法一次性执行整个命令,但当执行大量数据时,它可能会导致应用程序的内存飙升,因为它无法流式读取输出数据。
- spawn() 方法:
spawn() 方法使用流的方式处理数据,与 exec() 方法不同,它可以同时执行多个命令,并且不会在内存使用方面出现问题。spawn() 方法也支持成批分段输出数据,避免了大量的缓冲区分配。spawn() 方法还允许进一步配置选项,例如设置输出格式、重定向输入和输出流等。
结论:总的来说,在对性能有要求的情况下,可以使用 spawn() 方法,而不是 exec() 方法。如果只需要执行简单的 shell 命令并且无需处理大量输出,可以选择 exec() 方法。