shell脚本和编程
学习 shell 的价值
1.Linux 服务器的基本操作和管理
2.前端 Node.js 服务的进程管理、问题排查、资源监控等运维操作
3.使用 shell 编写 TCE、SCM、Docker 脚本,完成服务编译和部署
课程准备
一台安装了 linux 系统的物理机或者云主机,可运行 shell 脚本;本地的 vscode 安装 Bash Debug 插件,并升级 bash 到 4.x 以上;Npm 全局安装 zx 依赖
01 shell基础概念
1.1 概念
终端:获取用户输入,展示运算结果的硬件设备
tty:teletypeWriter的简称,和终端等价,早期指电传打印机。在linux中是输入、输出环境
终端模拟器:Mac Terminal、iTerm2等,关联虚拟tty 的输入输出软件
Shell:command interpreter.处理来自终端模拟器的输入,解释执行之后输出结果给终端
Bash:shell的一种具体实现
1.2 发展
1.3 构成
02 命令和语法
2.1变量
整型、浮点型、日期型需要手动声明
系统环境变量所有shell都是共享或者相同的
当父进程在执行第三方或者核心工具的时候会启动子进程去执行,执行完毕交还给父进程,父进程才继续下一条命令。在这个过程大中锋,自定义变量是只在父进程生效的,另外两个变量父子进程都可以用到
自己测试环境变量使用:
要修改环境变量:vim ~/.bashrc 使命令生效source ~/.bashrc
2.2配置文件加载
shell类型:登录式和非登录式例如输入sh,bash打开的就是非登录式的。非登录式又细分为交互式和非交互式。
交互式:会在终端等待用户输入,处理之后会将结果反馈出来 非交互式:比如输入sh test.sh就会直接执行脚本,没有等待用户输入
下图表示登录式shell,登陆之后会从/etc/profile开始,加载下一步的那些文件,再按箭头依次执行文件;非登录式就没有上边的过程
2.3运算符和引用
单个括号和反引号是一样的效果;要想命令各自执行就使用分号
比如node server.js &可以让命令在后台运行,不会影响到继续使用。但是如果关闭了当前页面,文件运行也会关闭。如果想要关闭了命令仍然执行,可以使用nohup。即nohup node server.js &
2.4管道
-an查看连接状态。多次使用管道符可以实现连续传递
自己测试:xargs就是将标准输入转化为参数列表的形式,然后交给ls使用
2.5重定向
重定向修改以上默认文件关系fd012输出.2>表示标准错误输出。>符号前边可以加个1,通常情况下可以省略
自己测试:
读取list下的每一行执行while循环,把每一行信息用管道传输给cut 截取文件第1行再传输追加存储到auth.txt文件 循环结束覆盖存储到list.txt
while read -r line; do
echo $line | cut -d " " -f 1 | xargs >> auth.txt
done < ./list.txt
2.6判断命令
2.7分支语句
先判断level是否非空,是的话再判断是否为0为1
连续判断的例子:-o、-e表示或、与的关系
2.8循环
2.9函数
要引用这个函数直接使用即可 用空格间隔方法参数 2表示方法参数
local表示在当前作用域生效;如果不使用local,可以使用unset把变量撤销一下
2.10模块化
2.11常用命令
-A代表before -B代表after -A3 -B3代表搜索出来的前三行和后三行
-f会等待读取下边命令的输入,一般在排查问题的时候使用
03 执行过程和原理
前提:文件名有可执行权限
前两种会在子进程当中执行脚本,source只会在当前进程执行
3.1执行过程
user部分表示脚本,他在启动之后会交给bash解释器去执行,解释器内部会执行蓝色框框里的几个阶段,经过了字符解析阶段,bash就已经得到了最基本可以执行的命令了。
3.2shell脚本
大括号会在展开的时候和他的前缀、后缀做拼接

04 调试和前端集成
4.1调试
使用set命令,一般会在shell开头的时候是有 set -uxe -o pipefail
4.2vscode配置
4.3前端集成
可以使用child_process的exec或者spawn去调用shell命令
exec和spawn的区别:
exec会使用子shell去执行传入的命令,并且将结果存到缓冲区。执行完之后将缓冲区的结果返回到函数中。但是这个缓冲区是有大小200KB限制的;
spawn不会启动子shell进程,结果会返回一个流对象,我们直接对这个流对象进行写入和读取。没有大小限制。比较适合大数据量的操作。
node命令启动js脚本:
set -e
node ./exec.js
echo 'success
课程总结
感想:
这门课程是第一次系统学习shell的使用,包含的内容很多。尤其是命令部分,需要记住的很多,目前是半蒙半懂的姿态。当然后续自己也需要课后多加练习这些命令才能熟练掌握shell使用。