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

71 阅读3分钟

引入

shell在我们程序员日常业务中十分重要,具体包括以下几个方面:

  • Linux服务器基本的操作和管理。
  • 前端Nodejs服务的进程管理、问题排查、资源监控等运维操作。
  • 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署。

1.Shell基础概念

image.png

贝尔实验室在1971年为Unix开发了第一个shell,称为V6 Shell,其后诞生了sh,即为了V7 Unix开发的Bourne shell。直到开源组织GUN为了取代sh开发了Bash。

Shell是一个命令行解释器,也是一个编程语言。

image.png

2.命令和语法

2.1. 变量

下表反映了shell的3种变量类型以及其一些相关信息

image.png

自定义变量大概可以用这种方式实现

image.png

image.png

Shell的运算符和引用大致可以从这一张表里看清楚:

image.png

  • 算术运算符和其他编程语言没有区别。

2.2. 管道

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

cmd1 | cmd2

image.png

注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail 设置 shell 遇到管道错误退出

2.3. 重定向

默认fd0-fd2会指向终端的输入输出。

image.png

重定向可以修改这种关系

image.png

2.4. 判断命令

shell提供了test[[[三种判断符号。可作用于

  • 证书测试
  • 字符串测试
  • 文件测试

语法也很简单:

  • test condition
  • [ condition ]
  • [[ condition ]]

image.png

  • 与一般的编程语言不同,这里的命令中,中括号和命令之间的空格不能省略,例如[ condition ],不能写成[condition],否则会报错,这个和我们平时在编写html、python等语句的时候养成的“空格无所谓”的习惯大有不同
  • [和test是命令,只能使用自己支持的标志位,且<>=只能比较字符串
  • 中括号内的变量,最好都用引号括起来。比如下面这种情况:

image.png

  • [[更丰富,在整型比较中支持使用<>=,在字符串比较中也支持使用=~正则表达式.相对前面的[和test自由了不少

2.5. 语句

image.png

if语句和我们其他编程语言相差不大

image.png

我们可以看看case的示例

image.png 循环和js等差不多

image.png

函数有一些需要注意的点:

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

image.png

2.6. 模块化

模块化的原理是在当前shell内执行函数文件,方式如下:

image.png

3.执行过程和原理

shell脚本一般以.sh结尾(也可以不这么结尾,这只是一个约定,因为Linux具体会以文件后缀来做类型判定). 此外,第一行通常需要指定采用什么命令解释器来执行命令:

image.png

启动shell有3种方式:

image.png

前两种在子进程中进行脚本,最后一种会在当前进程运行脚本.

执行过程大致如下图所示:

image.png