Shell脚本和编程 | 青训营笔记
Shell基础概念
语法和命令
1)变量
| 类型 | 作用域 | 声明方式 | 规范 |
|---|---|---|---|
| 自定义变量 | 当前shell | = | 字符串、整型、浮点型、日期型 |
| 环境变量 | 当前shell及其子shell | export、declare -x | |
| 系统环境变量 | 所有shell | 启动加载 | |
2)管道:管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令
语法: cmd1 | cmd2
要求:管道右侧的命令必须能接受标准输入才行,比如grep命令,ls、mv等不能直接使用,可以使用xargs预处理
注意:管道命令紧紧处理stdout,对于stderr会予以忽略,可以使用set -o pipefail 设置 shell 遇到管道错误退出
3)重定向
1、输出重定向符号:
- 》:覆盖写入文件
- 》》:追加写入文件
- 2》:错误输出写入文件
- &》:正确和错误输出统一写入到文件中
2、判断命令:shell中提供了test、[、[[ 三种判断符号,可用于:
- 整数测试
- 字符串测试
- 文件测试
语法:
- test condition
- [ condition ]
- [[ condition ]]
注意:
-
中括号前后要有空格符
-
[ 和 test 是命令,只能使用自己支持的标志位, < > = 只能用来比较字符串
-
中括号内的变量,最好都是用引号括起来
-
[[ 更丰富,在整形比较中支持< > = ,在字符串比较中支持= ~ 正则
循环
// while 循环
while condition; do 程序段; done
// until 循环
until condition; do 程序段; done
// for循环
for var in [words...]; do 程序段; done
函数
// 语法一
funcName(){ echo "abc" }
// 语法二
function funcName(){ echo "abc" }
注意:
- shell自上而下执行,函数必须在使用前定义
- 函数获取变量和shell script 类似, n获取
- 函数内 return 仅仅表示函数执行状态,不代表函数执行结果
- 返回结果一般使用 echo、printf,在外面使用$( )、' '获取结果
- 如果没有return,函数状态是上一条命令的执行状态,存储在$?中
4)模块化:模块化的原理实在当前 shell 内执行函数文件
执行过程和原理
1、shell 脚本一般以.sh结尾,也可以没有,这是一个约定
2、启动方式
# 文件名运行
./filename.sh
# 解释器运行
bash ./filename.sh
3、执行过程
1)字符解析
- 识别换行符、分号;做行的分割
- 识别命令连接符做命令的分割
- 识别空格、tab符做命令和参数的分割
2) shell展开
3) 重定向,将stdin、stdout、stderr的文件描述符进行只想更正
4)执行命令
4、shell展开
1)大括号展开
2)参数展开
3)命令替换
4)数学计算
5)文件名展开
调试和前端项目集成
1)普通log,使用echo、printf
2)使用set命令
3)vscode debug插件
vscode配置
1、shellman:代码提示和自动补全
2、shellcheck:代码语法校验
3、shell-format:代码格式化
4、bash debug:支持单步调试