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

75 阅读4分钟

课程重点

  • shell 基础和语法
  • shell 执行过程和原理
  • shell 调试和前端集成

课程内容

shell构成: image.png

语法和命令

变量

shell当中的变量分为三种: image.png 上表中提及的父子shell的概念可以看这个: image.png 当前shell指的就是父进程,当这个父进程在执行一个第三方或者是核心工具时,它会启动一个子进程去执行,执行完成后交还给父进程。父进程再去执行下一条命令。

自定义变量的使用

image.png declare命令具备一些基本的选项: image.png

系统环境变量

image.png 一般是>电脑的用户名 变量名 来使用: image.png 其中$PATH,它是用分割的一连串字符串。前后是一些目录和文件的名称。
$PATH主要用于shell在执行命令的时候查找命令的路径。它会从左到右的搜索这些目录底下的命令,找到了就执行它。
这些环境变量的值是在需要启动的时候,从环境变量配置文件里面读取以及初始化的。

如果我们想要修改这些变量的默认值,我们也可以去这些配置文件里去改。
eg:vim ~/.bashrc 改好后再用source ~/.bashrc去执行一下。 image.png 这个bashrc是不需要启动的时候加载的配置文件之一。
配置文件加载
shell有两种类型:login shell(登录式)non-login shell(非登录式)
login shell(登录式)就是你首次登录主机的时候,需要你输入用户名和密码。 image.png login shell(登录式)会从/etc/profile开始加载,再去加载~/bash_profile等,接着再去找~/.bashrc文件再去执行/etc/bashrc
non-login shell(非登录式)就直接找~/.bashrc文件再去执行/etc/bashrc
如果我们修改了某一个配置文件,想让它在当前项目里面生效,那我们就需要用source来执行一下这个脚本。eg:source ~/.bashrc

运算符和引用

image.png &有一个弊端: image.png 当这个shell关闭了,它也会关闭。如果想让他在shell关闭后不关闭,需要搭配nohupimage.png

管道

管道使用管道符去连接几个命令。
管道与管道符|,作用是将前一个命令的结构传递给后面的命令。(前一个命令的输出会作为后一个命令的输入)
语法:cmd1 | cmd2
image.png 管道和管道符有几个需要注意的点:

  • 管道右侧的命令必须能接受标准输入才行,比如:grep命令,ls、mv等不能直接使用,可以使用xargs预处理。
  • 管道命令仅仅处理stdout,对于stderr会予以忽略(不会退出/报错),可以使用set -o pipefail设置shell遇到管道错误退出

重定向

image.png 重定向可以修改这些默认的引用关系。
比如将fd0指向某一个文件,将fd1、fd2指向某一个文件: image.png 上图包含了输入重定向输出重定向

判断命令

shell中提供了test、[、[[三种判断符号,可用于:

  • 整数测试
  • 字符串测试
  • 文件测试

语法:

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

以test为例: image.png 需要注意的是:

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

image.png

分支语句

image.png image.png

循环

image.png image.png

函数

语法一:funcName(){ echo "abc";}
语法二:function funcName(){ echo "abc";} image.png 注意:

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

image.png

模块化

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

常用命令(面试考察)

image.png

执行过程和原理

image.png

执行过程

image.png 1.字符解析

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

2.shell展开,eg:{1..3}解析为1 2 3
3.重定向,将stdin、stdout、stderr的文件描述符进行指向变更
4.执行命令

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

5.收集状态并返回(给脚本)

shell展开

1.大括号展开{...}

一般由三部分构成,前缀、一对大括号、后缀,大括号内可以是逗号分割的字符串序列,也可以是序列表达式x..y[..incr] image.png

2.波浪号展开~

image.png

3.参数展开

1.间接参数扩展${!parameter},其中引用的参数并不是parameter而是parameter的实际的值 image.png
2.参数长度${parameter}
3.空参数处理 image.png 例子:image.png
4.参数切片
${parameter:offset}
${parameter:offset:length}
5.参数部分删除
${parameter%word}# 最小限度从后面截取word
${parameter%%word}# 最大限度从后面截取word
${parameter#word}# 最小限度从前面截取word
${parameter##word}# 最大限度从前面截取word image.png

4.命令替换

在子进程中执行命令,并用得到的结果替换包裹的内容,形式上有两种:$(...)或``...` image.png

5.数学计算$((..))

image.png

6.文件名展开*?[..]外壳文件名模式匹配

image.png

调试和前端集成

调试

1.普通log,使用echo、printf image.png
2.使用set命令 image.png

image.png
3.vscode debug插件 其中vscode有以下几个插件:

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

前端集成

image.png

image.png