Shell基础概念
- 终端
- 获取用户输入、展示运算结果的硬件设备
- tty
- teletypeWriter的简称,和终端等价,早期指电传打印机、在linux中是输入/输出环境
- 终端模拟器
- Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
- Shell
- command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端
- Bash
- Shell的一种具体实现
shell和Bash的关系可以理解成类和实例的关系
命令和语法
变量分为3种类型
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串、整形、浮点型、日期型 |
| 环境变量 | 当前shell及其子shell | export、declare -x | - |
| 系统环境变量 | 所有shell | 启动加载 | - |
declare [+/-] 变量
| 选项 | 含义 |
|---|---|
| - | 给变量设定类型属性 |
| + | 取消变量的类型属性 |
| -a | 将变量声明为数组类型 |
| -i | 将变量声明为整数型 |
| -x | 将变量声明为环境变量 |
| -r | 将变量声明为只读变量 |
| -p | 显式指定变量的被声明的类型 |
自定义变量
# 变量名=变量值(等号左右不能有空格)
page_size=1
page_num=2
# 将命令复制给变量
_ls=ls
# 将命令结果赋值给变量
file_list=$(ls -a)
# 默认字符串,不会进行 + 运算
total=page_size*page_num
# 声明变量为整型
let total=page_size*page_num
declare -i total=page_size*page_num
# 导出环境变量
export total
declare -x total
| 变量名 | 含义 | 常见操作 |
|---|---|---|
| $0 | 当前shell名称/脚本名称 | $1、$2等可以获取到传入参数 |
| $# | 传入脚本的参数数量 | if [$# -g 1] |
| $* | 传入脚本的所有参数 | - |
| $? | 上条命令执行的状态码 | if [ $? -eq 0 ]; |
| $PS1 | 命令提示符 | export PS1="\u@\h \w> " |
| $HOME | 用户主文件夹 | cd ~ |
| $PATH | 全局命令的搜索路径 | PATH=$PATH:[新增路径] |
配置文件的加载流程
在修改配置文件后,要使用
source ~/xxx刷新生效
执行过程和原理
- shell脚本一般以 .sh 结尾, 也可以没有, 这是一个约定; 第一行需要指定用什么命令解释器来执行 #! /bin/bash #! /usr/bin/env bash
- 执行过程有5步
- 字符解析
- 识别换行符、 分号(;) 做行的分割
- 识别命令连接符(|| && 管道) 做命令的分割
- 识别空格、tab符,做命令和参数的分割
- shell 展开, 例如 {1..3} 解析为 1 2 3
- 重定向, 将stdin、stdout、stderr的文件描述符进行指向变更
- 执行命令
- builtin 直接执行
- 非 builtin 使用 $PATH 查找,然后启动子进程执行
- 收集状态并返回
调试和前端集成
- node中通过 exec、spawn 调用 shell 命令
- shell 脚本中调用 node 命令
- 借助 zx 等库进行 javascript、 shell script 的融合
个人总结
- Shell基础概念涉及了很多知识,包括终端、tty、终端模拟器、Shell和Bash
- 命令和语法部分介绍了变量的不同类型及其声明方式,以及常见的变量操作和含义
- 配置文件的加载流程和执行过程和原理也有详细的解释(对于了解和熟悉使用Linux系统,了解其配置文件的加载是非常有必要的)