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

67 阅读2分钟

学习shell的价值

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

课程准备

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

01 Shell基本概念

01_ 构成

  1. shell:解释器,编程语言
  2. 解释器:bash内置命令,GUN核心工具集,第三方库
  3. 编程语言:变量,运算,语句,函数

02 命令和语法

02_ 自定义变量

#!/bin/bash
#变量名=变量值(等号左右不能有空格)
page_size=1
page_num=2
#将命令复制给变量
_ls=ls
#将命令结果赋值给变量
file_list=${ls -a}
#默认字符串,不会进行+运算
#声明变量为整型
let total=page_size*page_num
#导出环境变量
export total
declare -x total

02_ 配置文件加载

  • login-shell
  • non-login-shell

第一种shell是用户登录时打开的shell,而第二种是登录之后打开的shell。其中国非登录式shell还可分为交互式和非交互式,交互式就是普通模式,非交互式就是用sh打开某个文件的shell

02_ 重定向

  • >:覆盖写入文件
  • >>:追加写入文件
  • 2>:错误输出写入文件
  • &>:正确和错误输出统一写入到文件中

02_ 分支语句

语法1:

if condition ; then
    程序段
elif condition ; then
    程序段
esle
    程序段
fi

语法2:

case $变量 in:
    "第一个变量内容")
        程序段
        ;;
    "第一个变量内容")
        程序段
        ;;
    *)
    程序段
esac

02_ 函数

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

03 执行过程和原理

03_执行过程

  1. 字符解析
  • 识别换行符、分号做行的分割
  • 识别命令连接符(|| && 管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割
  1. shell展开,例如{1..3}解析为1 2 3
  2. 重定向,将stdin,stdout,stderr的文件描述符进行指向变更
  3. 执行命令
  • builtin直接执行
  • 非builtin使用$PATH查找,然后启动子进程执行
  1. 收集状态并返回

04 调试和前端集成

04_ 调试

  1. 普通log,使用echo、printf
  2. 使用set命令
  3. vscode debug插件

04_ Vscode配置

  1. shellman:代码提示和自动补全
  2. shellcheck代码语法检验
  3. shell-format:代码格式化
  4. Bash Debug:支持单步调试
  • 安装vscode插件
  • 编写launch.json文件
  • 升级bash到4.x以上版本

04_ 前端集成

  1. node中通过exec、spawn调用shell命令
  2. shell脚本中调用node命令
  3. 借助zx等库进行js、shell script的融合
  • 借助shell完成系统操作,文件io、内存、磁盘系统状态查询等
  • 借助nodejs完成应用层能力,网络io、计算等

总结

通过本节课程,了解了shell的基本概念和语法使用,发现里面有些操作和js挺像的,比如var,let(ES6的let估计就是直接借鉴shell里面的吧),虽然没什么基础,但感觉上手应该是没什么问题的。