shell脚本和编程 | 青训营笔记

89 阅读4分钟

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的一种具体实现 image.png

1.2 发展

image.png

1.3 构成

image.png

02 命令和语法

2.1变量

整型、浮点型、日期型需要手动声明

系统环境变量所有shell都是共享或者相同的

当父进程在执行第三方或者核心工具的时候会启动子进程去执行,执行完毕交还给父进程,父进程才继续下一条命令。在这个过程大中锋,自定义变量是只在父进程生效的,另外两个变量父子进程都可以用到 image.png

image.png

image.png 自己测试环境变量使用:

image.png 要修改环境变量:vim ~/.bashrc 使命令生效source ~/.bashrc

2.2配置文件加载

shell类型:登录式和非登录式例如输入sh,bash打开的就是非登录式的。非登录式又细分为交互式和非交互式。

交互式:会在终端等待用户输入,处理之后会将结果反馈出来 非交互式:比如输入sh test.sh就会直接执行脚本,没有等待用户输入

下图表示登录式shell,登陆之后会从/etc/profile开始,加载下一步的那些文件,再按箭头依次执行文件;非登录式就没有上边的过程

image.png

2.3运算符和引用

单个括号和反引号是一样的效果;要想命令各自执行就使用分号

比如node server.js &可以让命令在后台运行,不会影响到继续使用。但是如果关闭了当前页面,文件运行也会关闭。如果想要关闭了命令仍然执行,可以使用nohup。即nohup node server.js & image.png

2.4管道

-an查看连接状态。多次使用管道符可以实现连续传递 image.png 自己测试:xargs就是将标准输入转化为参数列表的形式,然后交给ls使用

image.png

2.5重定向

image.png 重定向修改以上默认文件关系fd012输出.2>表示标准错误输出。>符号前边可以加个1,通常情况下可以省略 image.png 自己测试:

image.png 读取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

image.png

2.6判断命令

image.png

2.7分支语句

先判断level是否非空,是的话再判断是否为0为1 image.png 连续判断的例子:-o、-e表示或、与的关系 image.png

2.8循环

image.png

image.png

2.9函数

要引用这个函数直接使用即可 用空格间隔方法参数 !,!,2表示方法参数 image.png

local表示在当前作用域生效;如果不使用local,可以使用unset把变量撤销一下

2.10模块化

image.png

2.11常用命令

-A代表before -B代表after -A3 -B3代表搜索出来的前三行和后三行 -f会等待读取下边命令的输入,一般在排查问题的时候使用 image.png

03 执行过程和原理

前提:文件名有可执行权限 前两种会在子进程当中执行脚本,source只会在当前进程执行 image.png

3.1执行过程

user部分表示脚本,他在启动之后会交给bash解释器去执行,解释器内部会执行蓝色框框里的几个阶段,经过了字符解析阶段,bash就已经得到了最基本可以执行的命令了。

image.png

3.2shell脚本

image.png 大括号会在展开的时候和他的前缀、后缀做拼接 image.png

image.png

image.png

image.png

image.png

image.png

image.png

04 调试和前端集成

4.1调试

image.png

使用set命令,一般会在shell开头的时候是有 set -uxe -o pipefail image.png

4.2vscode配置

image.png

4.3前端集成

可以使用child_process的exec或者spawn去调用shell命令

exec和spawn的区别:

exec会使用子shell去执行传入的命令,并且将结果存到缓冲区。执行完之后将缓冲区的结果返回到函数中。但是这个缓冲区是有大小200KB限制的;

spawn不会启动子shell进程,结果会返回一个流对象,我们直接对这个流对象进行写入和读取。没有大小限制。比较适合大数据量的操作。 image.png node命令启动js脚本:

set -e

node ./exec.js

echo 'success

课程总结

image.png 感想:

这门课程是第一次系统学习shell的使用,包含的内容很多。尤其是命令部分,需要记住的很多,目前是半蒙半懂的姿态。当然后续自己也需要课后多加练习这些命令才能熟练掌握shell使用。