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

83 阅读2分钟

Shell基础概念

概念

终端

获取用户输入、展示运算结果的硬件设备

终端模拟器

Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件

tty

teletypeWriter的简称,和终端等价,早期指电传打印机,在Linux中式输入/输出环境

Shell

command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端

Bash

Shell的一种具体实现

发展

  1. Ken Thompson(来自贝尔实验室)在1971年为UNIX 开发了第一个 shell,称为 V6 shell
  2. Stephen Bourne 在贝尔实验室 为V7 UNIX 所开发的 Bourne shell,即 sh
  3. 开源组织 GNU为了取代 Bourne shell 开发的 Bourne-Again shell,即 Bash

image.png

构成

A Unix shell is both a command interpreter and a programming language. As a command interpreter, the shell provides the user interface to the rich set of GNU utilities.

image.png

命令和语法

变量

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

父子Shell

image.png

系统环境变量

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

配置文件加载

image.png

管道

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

语法:cmd1|cmd2

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

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

#!/bin/bash
cat platform.access.log | grep ERROR
netstat -an | grep ESTABLISHED | wc -l
find . -maxdepth 1 -name "*.sh" | xargs 1s -l

执行过程和原理

  1. 字符解析
  • 识别换行符、 分号(;)做行的分割
  • 识别命令连接符(|| && 管道)做命令的分割
  • 识别空格、tab符,做命令和参数的分割
  1. shell 展开, 例如 {1..3} 解析为 1 2 3

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

  3. 执行命令

builtin 直接执行

非 builtin 使用SPATH查找,然后启动子进程执行

  1. 收集状态并返回

image.png

调试和前端集成

VSCode配置

  1. shellman: 代码提示和自动补全

  2. shellcheck: 代码语法校验

  3. shell—format: 代码格式化

  4. Bash Debug: 支持单步调试

  • 安装 vscode 插件
  • 编写 launch. json文件
  • 升级bash到4.x以上版本

前端集成

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