引入
shell在我们程序员日常业务中十分重要,具体包括以下几个方面:
- Linux服务器基本的操作和管理。
- 前端Nodejs服务的进程管理、问题排查、资源监控等运维操作。
- 使用shell编写TCE、SCM、Docker脚本,完成服务编译和部署。
1.Shell基础概念
贝尔实验室在1971年为Unix开发了第一个shell,称为V6 Shell,其后诞生了sh,即为了V7 Unix开发的Bourne shell。直到开源组织GUN为了取代sh开发了Bash。
Shell是一个命令行解释器,也是一个编程语言。
2.命令和语法
2.1. 变量
下表反映了shell的3种变量类型以及其一些相关信息
自定义变量大概可以用这种方式实现
Shell的运算符和引用大致可以从这一张表里看清楚:
- 算术运算符和其他编程语言没有区别。
2.2. 管道
管道用管道符|来实现,作用是将前一个命令的结果传递给后面的命令。
cmd1 | cmd2
注意:管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail 设置 shell 遇到管道错误退出
2.3. 重定向
默认fd0-fd2会指向终端的输入输出。
重定向可以修改这种关系
2.4. 判断命令
shell提供了test、[、[[三种判断符号。可作用于
- 证书测试
- 字符串测试
- 文件测试
语法也很简单:
test condition[ condition ][[ condition ]]
- 与一般的编程语言不同,这里的命令中,中括号和命令之间的空格不能省略,例如
[ condition ],不能写成[condition],否则会报错,这个和我们平时在编写html、python等语句的时候养成的“空格无所谓”的习惯大有不同 [和test是命令,只能使用自己支持的标志位,且<>=只能比较字符串- 中括号内的变量,最好都用引号括起来。比如下面这种情况:
[[更丰富,在整型比较中支持使用<>=,在字符串比较中也支持使用=~正则表达式.相对前面的[和test自由了不少
2.5. 语句
if语句和我们其他编程语言相差不大
我们可以看看case的示例
循环和js等差不多
函数有一些需要注意的点:
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,
$0代表函数名,后续参数通通过$1、$2...获取 - 函数内return仅仅表示函数执行状态,不代表函数执行结果果
- 返回结果一般使用echo、printf,在外面使用
$()、"多取结果 - 如果没有return,函数状态是上一条命令的执行状态,存储在
$?中
2.6. 模块化
模块化的原理是在当前shell内执行函数文件,方式如下:
3.执行过程和原理
shell脚本一般以.sh结尾(也可以不这么结尾,这只是一个约定,因为Linux具体会以文件后缀来做类型判定). 此外,第一行通常需要指定采用什么命令解释器来执行命令:
启动shell有3种方式:
前两种在子进程中进行脚本,最后一种会在当前进程运行脚本.
执行过程大致如下图所示: