Shell脚本和编程 笔记
Shell基础概念
Shell 处理来自终端模拟器的输入,解释执行之后输出结果给终端
构成
命令和语法
变量
自定义变量默认为字符串型,整型浮点型日期型等需要特别声明。
父shell处理某些输入时会产生子shell,此时父shell会暂停直至子shell处理完成。
是因为其他几种类型可以通过展开再进入字符串吗?好像不对,为什么字符串会成为默认类型?它使用频率特别高吗?
一些关于自定义变量的例子
“=”两边不能有空格
系统环境变量
配置文件加载
运算符和引用
有一说一,为什么这些“||”和“&&”在不同语言里有些差距会这么大,用的人不会感觉很折磨吗?
也许因为符号种类限制以及使用频率,改成了这样吧。还是根据语言的使用场景来设计语言的。
管道: 管道与管道符 | ,作用是将前一个命令的结果传递给后面的命令。
语法: cmd1 | cmd2
要求: 管道右侧的命令必须能接受标准输入,比如 grep命令,ls、mv等不能直接使用,可用 xargs预处理。
这个预处理将标准输入转为参数列表,为什么不统一一种数据返回格式呢?......也许有些输入比较单一,转为参数列表对于能接受标准输入的命令还多了查找参数,反而拖累效率了。
注意: 管道命令仅仅处理stdout,对于stderr会予以忽略,可以使用set -o pipefail设置shell遇到管道错误退出。
重定向
判断命令
-eq =
-et <
-gt >
-z ""
-n !""
-e 是否存在
-f 是否存在及是否为普通文件
分支语句
蛮奇怪为什么要有elif的,查询也只找到了python相关...悲。但发现else必是最后一个分支,且不需要接then关键字。
case那边,* 类似于 default
循环图
函数
居然自带状态码返回啊...shell对错误很严格吗?
模块化
感觉蛮像包的,不过用路径管理
常用命令
执行过程和原理
关于执行图
执行过程
调试和前端集成
调试
1.普通log,使用echo、printf
2.使用set命令(根据不同shell可能会略有不同)
3.vscode debug插件