基础概念
- 终端:获取用户输入、展示运算结果的硬件设备
- tty:和终端等价,早期指电传印机,在linux中是输入/输出环境
- 终端模拟器:关联虚拟tty的输入输出软件
- shell:处理来自终端模拟器的输入,解释执行之后输出结果给终端
- bash:shell的一种具体实现
语法和命令
变量
- 自定义变量:作用域为当前shell,声明方式:“=”。规范:字符串、整型、浮点型、日期型
变量名=变量值(等号左右不能有空格)
可以将命令赋值给变量
也可以将命令结果赋值给变量
默认字符串不会进行+运算
let 关键字声明变量为整型
- 环境变量:作用域:当前shell及其子shell,声明方式:export、declare -x
- 系统环境变量:作用域:所有shell,声明方式:启动加载
运算符和引用
管道
管道与管道符 “ | ”,作用是将前一个命令的结果传递给后面的命令
语法:cmd1 | cmd2
要求: 管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理
注意: 管道命令仅仅处理stdout,对应stderr会予以忽略,可以使用set -o pipefail设置shell遇到管道错误退出
重定向
输出重定向:
- '>' :覆盖写入文件
- '>>' :追加写入文件
- '2>':错误输出写入文件
- '&>':正确和错误输出统一写入到文件中
输入重定向:
- <
- <<
判断命令
shell中提供了test、[、[[三种判断符号,可用于:
- 整数测试
- 字符串测试
- 文件测试
语法:
- test condition
- [ condition ]
- [[ condition ]]
注:
-
中括号前后要有空格
-
[ 和test是命令,只能使用自己支持的标志位,<,>,=只能用来比较字符串
-
中括号内的变量,最好都是用引号括起来
-
[[ 更丰富,在整型比较中支持<,>,=,在脂肪醇比较中支持=~正则 注:
-
shell自上而下执行,函数必须在使用前定义
-
函数获取变量和shell script类似,0代表函数名,后续参数通过$$1、2…..获取
-
函数内return仅仅表示函数执行状态,不代表函数执行结果
-
返回结果一般使用echo、printf,在外面使用$()、''获取结果
-
如果没有return,函数状态是上一条命令的执行状态,存储在$?中
-
在函数内定义变量一般加local关键字,表示在当前作用域内生效
模块化
在当前shell内执行函数文件
方式:
- source [路径]
执行过程和原理
执行
- shell脚本一般以.sh结尾,也可以没有,这是一个约定,第一行需要指定用什么命令解释器来执行
!/解释器路径 /bin/bash或/usr/bin/env bash
- 启动方式
1.文件名运行 ./文件名 2.解释器运行 bash 文件路径 3.source运行 source 文件路径
前两种在子进程执行脚本后两种在当前进程执行脚本
执行过程
- 字符解析
- shell展开
- 重定向
- 执行命令
- 收集状态并返回
调试和前段集成
调试
- 普通log,使用echo、print
- 使用set命令
- vscode debug插件
vscode配置
- shellman:代码提示和自动补全
- shellcheck:代码语法校验
- shell-format:代码格式化
- bash debug:支持单步调试
集成
- node中通过exec、spawn调用shell命令
- shell脚本中调用node命令
- 借助zx等库进行js、shell script融合