Shell 脚本和编程 (Part 1) | 青训营笔记

76 阅读4分钟

依然很多,分成两部分来做咯,部分搞不出来的图表就贴图片了~

学习shell的价值:

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

课程准备

  • 一台安装了 linux 系统的物理机或者云主机,可运行 shell 脚本
  • 本地的 vscode 安装 Bash Debug 插件,并升级 bash 到4.x以上
  • Npm 全局安装 zx 依赖

Shell基础概念

概念

层次:物理终端 => 软件终端 tty => 终端模拟器 => shell

终端最开始指的是获取用户输入并输出的物理设备, 比如电传打字机。

在 linux 中,终端模拟器是接收用户输入、输出结果的终端仿真软件, 比如 mac terminal、 iterm2 等,更强输入辅助功能、画面绘制输出的模拟终端器;而 tty 变成一个虚拟概念,是linux的一个程序,每个终端模拟器关联一个虚拟 tty,和内核打交道。 我们可以在终端模拟器中输入 tty 查看关联到的虚拟 tty。

bash是shell的一种具体实现,可以理解成实例和类的关系。

发展

Ken Thompson(来自贝尔实验室)在1971年为UNIX开发了第一个shell,称为V6 shell

Stephen Bourne在贝尔实验室为V7 UNIX所开发的Bourne shell,即sh

开源组织GNU为了取代Bourne shell开发的Bourne-Again shell,即 Bash

Bash 是 sh 的超集,可以直接执行大部分 sh 脚本。

构成

image.png

Shell不仅提供了与内核和设备交互的方法,还集成了一些今天软件开发中通用的设计模式(比如管道和过滤器),具备控制流程,循环,变量,命令查找的机制。

语法和命令

变量

类型作用域声明方式规范
自定义变量当前 shell=字符串、整型、浮点型、日期型
环境变量当前 shell 及其子 shellexport、declare -x-
系统环境变量所有 shell启动加载-

image (1).png

自定义变量

declare [+/-] 选项 变量

具体参数:

选项含义
-给变量设定类型属性
+取消变量的类型属性
-a将变量声明为数组类型
-i将变量声明为整数型
-x将变量声明为环境变量
-r将变量声明为只读变量
-p显示指定变量的被声明的类型

系统环境变量

变量名含义常见操作
$0当前shell名称/脚本名称11、2等可以获取到传入参数
$#传入脚本的参数变量if [$# -gt 1]
$*传入脚本的所有参数-
$?上条命令执行的状态码if [$? -eq 0];
$PS1命令提示符export PS1 = "\u@\h \w>"
$HOME用户主文件夹cd ~
$PATH全局命令的搜索路径PATH=$PATH:[新增路径]

Bash Shell 在启动时总要配置其运行环境, 例如初始化环境变量、设置命令提示符、指定系统命令路径等。

配置文件加载

image (3).png

  • 通过系统用户登录默认运行的shell

  • 非登录交互式运行shell

  • 执行脚本运行非交互式shell

如果取得 bash 需要完整的登录流程,称为 login shell,比如 ssh 远程登录一台主机;

否则称为 non-login bash, 比如在原来的 bash 中执行 bash 开启子进程、 执行一些外部命令。

如果修改了配置文件,不会立即生效,需要我们重启终端或者执行 source 命令。

运算符和引用

image (4).png

cmd & 实现让命令在后台运行。

管道

管道与管道符│ ,作用是将前一个命令的结果传递给后面的命令

语法: cmd1 | cmd2

要求: 管道右侧的命令必须能接受标准输入才行,比如 grep命令,ls、mv等不能直接使用,可以使用xargs预处理

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

也就是两个命令之间的互通

重定向

image (5).png

输出重定向符号

>: 覆盖写入文件

>>: 追加写入文件

2>: 错误输出写入文件

&>: 正确和错误输出统一写入到文件中

输入重定向符号

<

<<

每个 shell 命令在执行时都会打开三个文件描述符,文件描述符 0、1、2 分别对应 stdin、stdout、stderr,这三个文件描述符默认指向终端输入、终端输出,那么当命令需要获取输入的时候,它会去读取 fd0,当要输出的时候它会像 fd1、fd2写入,改变这些描述符指向的行为叫做重定向。

判断命令

image (7).png

image (6).png

注意:

  • 中括号前后要有空格符;
  • [test 是命令,只能使用自己支持的标志位,<>=只能用来比较字符串
  • 中括号内的变量,最好都是用引号括起来。
  • [[更丰富,在整型比较中支持<>=,在字符串比较中支持=~正则。

分支语句

image (9).png

image (8).png

循环

image (11).png

image (10).png

image (12).png

函数

image (13).png

function 可有可无。

注意shell自上而下执行代码,函数需要提前定义。

模块化

即在当前shell执行函数文件。

source [函数库的路径]

image (14).png

常用命令

image (15).png