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

110 阅读3分钟

今天学习的是 Shell 编程。

前端程序员学习 Shell 的价值:

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

课程结构:

  • Shell 基本概念
  • 命令和语法
  • 执行过程和原理
  • 调试和前端集成

Shell 基本概念

理清几个关键词之间的区别:

  • 终端:获取用户输入,展示运算结果的硬件设备
  • tty:teletypeWriter 的简称,与终端等价,早期指电传打印机,在 Linux 当中是输入/输出环境
  • 终端模拟器:Mac Terminal、iTerm2 等,关联虚拟 tty 的输入输出设备
  • Shell:command interpreter(命令解释器),处理来自终端模拟器的输入,解释执行之后输出结果给终端
  • Bash:Shell的一种具体实现

Shell 和 Bash 的关系可以类似于类和对象实例的关系。

Shell 不仅仅是命令解释器,也是一种编程语言。

语法和命令

image.png

image.png

image.png

要知道的是,Shell 当中声明变量,等号两边是不需要空格的,加了空格反而会错。

image.png

image.png

login shell 和 non-login shell 加载的流程区别如下。 image.png

login shell 和 non-login shell 的区别:

  • login shell 是登录系统时获得的顶层 Shell,或者使用 -login 选项调用 bash 的 Shell。
  • non-login shell 是在已经登录的系统之中再启动的 Shell,比如在终端之中输入 bash 或者 zsh 命令。

image.png

先来解释一下curl命令的作用:是发出网络请求,然后得到和提取数据,显示在标准输出上面。

curl命令的具体用法:curl 的用法指南

管道

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

语法:cmd1 | cmd2

此处cmd1运行的结果会传递给cmd2

要求:管道右侧命令必须能够接受标准输入才可以,比如greplsmv都不能直接使用,但是可以使用xargs预处理。

image.png

image.png

分支语句

if condition; then
    程序段
elif condition; then
    程序段
else
    程序段
fi
case $变量 in:
    "第一个变量内容")
        程序段
        ;;
    "第一个变量内容")
        程序段
        ;;
    *)
    程序段
    ;;
esac

三种循环

  • while循环
    • while condition ; do 程序段; done
  • until循环
    • until condition ; do 程序段; done
  • for循环
    • for var in [words...]; do 程序段; done

函数的写法

  • 语法1:funcName(){echo "abc";}
  • 语法2:function funcName(){echo "abc";}

注意事项:

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

Shell 的模块化

模块化的原理是在当前 Shell 内执行函数文件,方式:source [函数库的路径]

image.png

执行过程和原理

Shell 脚本一般以 .sh 结尾,第一行用来指定用什么命令解释器进行执行。

#! /bin/bash
#! /usr/bin/env bash

上面就指定了用 bash 命令解释器进行执行。 下面是几种运行脚本的方式。

# 文件名执行(前提是用户需要有可执行权限)
./filename.sh

# 解释器执行
bash ./filename.sh

# source 运行
source ./filename.sh

前两种方式会在子进程当中执行脚本,最后一种是在当前进程执行脚本。

执行过程

1、字符解析

  • 识别换行符、分号(;)做行的分割
  • 识别命令连接符(|| && 管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割

2、Shell 展开

3、重定向,将 stdin、stdout、stderr 的文件描述符进行指向变更

4、执行命令

  • builtin 直接执行
  • 非 builtin 使用 $PATH 查找,然后启动子进程执行

5、收集状态并返回

image.png

image.png

image.png

image.png

image.png

image.png

调试和前端集成

1、普通 log,使用echo、printf

2、使用 set 命令

3、vscode debug 插件

image.png

vscode 配置

  • shellman:代码提示和自动补全
  • shellcheck:代码语法校验
  • shell-format:代码格式化
  • Bash Debug:支持单步调试

1、安装 vscode 插件

2、编写 launch.json 文件

3、升级 bash 到 4.x 以上版本

前端集成

1、node 中通过 exec、spawn 调用 shell 命令

2、shell 脚本中调用 node 命令

3、借助 zx 等库进行 javascript、shell script 的融合

  • 借助 shell 完成系统测试,文件 io,内存,磁盘系统状态查询等

  • 借助 nodejs 完成应用层能力,文件 io,计算等