一、Shell基础概念
1.概念
- (1)终端: 获取用户输入、展示运算结果的硬件设备
- (2)tty: teletypeWriter的简称,和终端等价早期指电传印机,在linux中是输入/输出环境
- (3)终端模拟器: Mac Terminal、iTerm2等,关联虚拟tty的输入输出软件
- (4)Shell: command interpreter,处理来自终端模拟器的输入,解释执行之后输出结果给终端
- (5)Bash: shell的一种具体实现
2.发展
3.构成
二、命令和语法
1.变量
2.自定义变量
3.系统环境变量
4.配置文件加载
5.运算符和引用
6.管道
管道与管道符|,作用是将前一个命令的结果传递给后面的命令
- 语法:cmd1|cmd2
- 要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,Is、mv等不能直接使用,可以使用xargs预处理
- 注意:管道命令仅仅处理stdout,对于stderr会予忽略,可以使用set-o pipefail设置shell遇到管道错误退出
#!/bin/bash
cat platform.access.log|grep ERROR
netsta -an|grep ESTABLISHED|wc -1
find . -maxdepth 1 -name "*.sh"|xargs ls -1
7.重定向
输出重定向符号
- '>':覆盖写入文件
- '>>':追加写入文件
- '2>':错误输出写入文件
- '&>':正确和错误输出统写入到文件中
输入重定向符号
'<'
'<<'
8.判读命令
shell中提供了test [、[[三种判断符号 可用于:
- 整数测试
- 字符串测试
- 文件测试
语法:
- test condition
- [ condition ]
- [[ condition ]]
注意: 中括号前后要有空格符;
- [和test是命令,只能使用自己支持的标志位,<、>、=只能用来比较字符串
- 中括号内的变量,最好都是用引号括起来
- [[更丰富,在整型比较中支持<、>、=,在字符串比较中支持=~正则
9.分支语句
语法1:
if condition; then
程序段
elif condition; then
程序段
esle
程序段
fi
语法2:
case $变量in:
“第一个变量内容”)
程序段
;;
"第一个变量内容")
程序段
;;
*)
程序段
;;
esac
10.循环
while循环
while condition;do 程序段;done
until循环
until condition; do 程序段; done
for循环
for var in [words...];do 程序段; done
11.函数
语法一:
funcName(){echo "abc";}
语法二:
function funcName(){echo "abc";}
注意:
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script类似,1、$2 …获取
- 函数内return仅仅表示函数执行状态. 不代表函数执行结果
- 返回结果一般使用echo、printf, 在外面使用S()、"获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
12.模块化
模块化的原理是在当前shell 内执行函数文件,方式:
source[函数库的路径]
13.常用命令
三、执行过程和原理
1.执行
- shell脚本一般以.sh 结尾,也可以没有,这是一个约定;第一行需要指定用什么命令解释器来执行
#!/bin/bash
#!/usr/bin/env bash
- **启动方式 **
#文件名运行
./filename.sh
#解释器运行
bash ./filename.sh
# source 运行
source ./filename.sh
2.执行过程
字符解析
- 识别换行符、分号(;)做行的分割
- 识别命令连接符(1&& 管道)做命令的分割
- 识别空格、tab符,做命令和参数的分割
shell展开, 例如(1..3)解析为1 2 3
重定向, 将stdin、stdout、stderr的文件描述符进行指向变更
执行命令
- builtin直接执行
- 非builtin使用SPATH查找,然后启动子进程执行
收集状态并返回
3.shell展开
- 大括号展开(Brace Expansion)
- 波浪号展开(Tilde Expansion)
- 参数展开(Shell Parameter Expansion)
- 命令替换(Command Substitution)
- 数学计算(Arithmetic Expansion) $((..))
- 文件名展开(Filename Expansion)*? [..]外壳文件名模式匹配
四、调试和前端集成
1.调试
- 普通log, 使用 echo、printf
- 使用 set 命令
- vscode debug插件
2.VSCode配置
- 1.shellman:代码提示和自动补全
- 2.shellcheck:代码语法校验
- 3.shell-format:代码格式化
- 4.Bash Debug:支持单步调试
-
- 安装 vscode插件
-
- 编写launch.json文件
-
- 升级 bash到4.x以上版本
3.前端集成
- node中通过exec、spawn调用 shell 命令
- shell 脚本中调用 node 命令
- 借助zx 等库进行 javascript、shell script 的融合
-
- 借助 shell 完成系统操作,文件io、内存、磁盘系统状态查
-
- 借助 nodejs 完成应用层能力, 网络io、计算等