diff --git "a/00_Zsh-\345\274\200\345\217\221\346\214\207\345\215\227\357\274\210\347\233\256\345\275\225\357\274\211.md" "b/00_Zsh-\345\274\200\345\217\221\346\214\207\345\215\227\357\274\210\347\233\256\345\275\225\357\274\211.md" new file mode 100644 index 0000000..bfd2122 --- /dev/null +++ "b/00_Zsh-\345\274\200\345\217\221\346\214\207\345\215\227\357\274\210\347\233\256\345\275\225\357\274\211.md" @@ -0,0 +1,222 @@ +# Zsh 开发指南 目录 +## [第一篇 变量和语句](01_Zsh-开发指南(第一篇-变量和语句).md) +### [导读](01_Zsh-开发指南(第一篇-变量和语句).md#导读) +### [为什么用 zsh 写脚本](01_Zsh-开发指南(第一篇-变量和语句).md#为什么用-zsh-写脚本) +### [Zsh 脚本样例](01_Zsh-开发指南(第一篇-变量和语句).md#Zsh-脚本样例) +### [为什么要使用 shell 脚本语言](01_Zsh-开发指南(第一篇-变量和语句).md#为什么要使用-shell-脚本语言) +### [格式约定](01_Zsh-开发指南(第一篇-变量和语句).md#格式约定) +### [变量](01_Zsh-开发指南(第一篇-变量和语句).md#变量) +- [变量定义](01_Zsh-开发指南(第一篇-变量和语句).md#变量定义) +- [变量比较](01_Zsh-开发指南(第一篇-变量和语句).md#变量比较) +### [语句](01_Zsh-开发指南(第一篇-变量和语句).md#语句) +- [条件语句](01_Zsh-开发指南(第一篇-变量和语句).md#条件语句) +- [循环语句](01_Zsh-开发指南(第一篇-变量和语句).md#循环语句) +- [分支语句](01_Zsh-开发指南(第一篇-变量和语句).md#分支语句) +- [用户输入选择语句](01_Zsh-开发指南(第一篇-变量和语句).md#用户输入选择语句) +- [异常处理语句](01_Zsh-开发指南(第一篇-变量和语句).md#异常处理语句) +- [简化的条件语句](01_Zsh-开发指南(第一篇-变量和语句).md#简化的条件语句) +### [总结](01_Zsh-开发指南(第一篇-变量和语句).md#总结) +## [第二篇 字符串处理之常用操作](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md) +### [导读](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#导读) +### [字符串长度](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串长度) +### [字符串拼接](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串拼接) +### [字符串切片](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串切片) +### [字符串截断](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串截断) +### [字符串查找](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串查找) +### [遍历字符](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#遍历字符) +### [字符串替换](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串替换) +### [判断字符串变量是否存在](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#判断字符串变量是否存在) +### [字符串匹配判断](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串匹配判断) +### [大小写转换](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#大小写转换) +### [目录文件名截取](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#目录文件名截取) +### [字符串分隔](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#字符串分隔) +### [多行字符串](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#多行字符串) +### [读取文件内容到字符串](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#读取文件内容到字符串) +### [读取进程输出到字符串](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#读取进程输出到字符串) +### [参考](02_Zsh-开发指南(第二篇-字符串处理之常用操作).md#参考) +## [第三篇 字符串处理之转义字符和格式化输出](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md) +### [导读](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#导读) +### [转义字符](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#转义字符) +### [单引号](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#单引号) +### [双引号](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#双引号) +### [反引号](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#反引号) +### [print 命令用法](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#print-命令用法) +### [print 命令选项功能介绍](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#print-命令选项功能介绍) +### [printf 命令用法](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#printf-命令用法) +### [输出带颜色和特殊样式的字符串](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#输出带颜色和特殊样式的字符串) +### [print 选项列表](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#print-选项列表) +### [参考](03_Zsh-开发指南(第三篇-字符串处理之转义字符和格式化输出).md#参考) +## [第四篇 字符串处理之通配符](04_Zsh-开发指南(第四篇-字符串处理之通配符).md) +### [导读](04_Zsh-开发指南(第四篇-字符串处理之通配符).md#导读) +### [通配符的基本用法](04_Zsh-开发指南(第四篇-字符串处理之通配符).md#通配符的基本用法) +### [加强版通配符](04_Zsh-开发指南(第四篇-字符串处理之通配符).md#加强版通配符) +### [总结](04_Zsh-开发指南(第四篇-字符串处理之通配符).md#总结) +### [参考](04_Zsh-开发指南(第四篇-字符串处理之通配符).md#参考) +## [第五篇 数组](05_Zsh-开发指南(第五篇-数组).md) +### [导读](05_Zsh-开发指南(第五篇-数组).md#导读) +### [数组定义](05_Zsh-开发指南(第五篇-数组).md#数组定义) +### [元素读写](05_Zsh-开发指南(第五篇-数组).md#元素读写) +### [数组拼接](05_Zsh-开发指南(第五篇-数组).md#数组拼接) +### [数组遍历](05_Zsh-开发指南(第五篇-数组).md#数组遍历) +### [数组切片](05_Zsh-开发指南(第五篇-数组).md#数组切片) +### [元素查找](05_Zsh-开发指南(第五篇-数组).md#元素查找) +### [元素排序](05_Zsh-开发指南(第五篇-数组).md#元素排序) +### [去除重复元素](05_Zsh-开发指南(第五篇-数组).md#去除重复元素) +### [使用连续字符或者数值构造数组](05_Zsh-开发指南(第五篇-数组).md#使用连续字符或者数值构造数组) +### [从字符串构造数组](05_Zsh-开发指南(第五篇-数组).md#从字符串构造数组) +### [从文件构造数组](05_Zsh-开发指南(第五篇-数组).md#从文件构造数组) +### [从文件列表构造数组](05_Zsh-开发指南(第五篇-数组).md#从文件列表构造数组) +### [数组交集差集](05_Zsh-开发指南(第五篇-数组).md#数组交集差集) +### [数组交叉合并](05_Zsh-开发指南(第五篇-数组).md#数组交叉合并) +### [对数组中的字符串进行统一的处理](05_Zsh-开发指南(第五篇-数组).md#对数组中的字符串进行统一的处理) +### [总结](05_Zsh-开发指南(第五篇-数组).md#总结) +### [参考](05_Zsh-开发指南(第五篇-数组).md#参考) +### [更新历史](05_Zsh-开发指南(第五篇-数组).md#更新历史) +## [第六篇 哈希表](06_Zsh-开发指南(第六篇-哈希表).md) +### [导读](06_Zsh-开发指南(第六篇-哈希表).md#导读) +### [哈希表定义](06_Zsh-开发指南(第六篇-哈希表).md#哈希表定义) +### [元素读写](06_Zsh-开发指南(第六篇-哈希表).md#元素读写) +### [哈希表拼接](06_Zsh-开发指南(第六篇-哈希表).md#哈希表拼接) +### [哈希表遍历](06_Zsh-开发指南(第六篇-哈希表).md#哈希表遍历) +### [元素查找](06_Zsh-开发指南(第六篇-哈希表).md#元素查找) +### [元素排序](06_Zsh-开发指南(第六篇-哈希表).md#元素排序) +### [从字符串、文件构造哈希表](06_Zsh-开发指南(第六篇-哈希表).md#从字符串、文件构造哈希表) +### [对哈希表中的每个元素统一处理](06_Zsh-开发指南(第六篇-哈希表).md#对哈希表中的每个元素统一处理) +### [总结](06_Zsh-开发指南(第六篇-哈希表).md#总结) +## [第七篇 数值计算](07_Zsh-开发指南(第七篇-数值计算).md) +### [导读](07_Zsh-开发指南(第七篇-数值计算).md#导读) +### [整数和浮点数类型](07_Zsh-开发指南(第七篇-数值计算).md#整数和浮点数类型) +### [运算符](07_Zsh-开发指南(第七篇-数值计算).md#运算符) +### [数学函数](07_Zsh-开发指南(第七篇-数值计算).md#数学函数) +### [参考](07_Zsh-开发指南(第七篇-数值计算).md#参考) +## [第八篇 变量修饰语](08_Zsh-开发指南(第八篇-变量修饰语).md) +### [导读](08_Zsh-开发指南(第八篇-变量修饰语).md#导读) +### [变量修饰语的格式](08_Zsh-开发指南(第八篇-变量修饰语).md#变量修饰语的格式) +### [变量默认值](08_Zsh-开发指南(第八篇-变量修饰语).md#变量默认值) +### [数组拼接成字符串](08_Zsh-开发指南(第八篇-变量修饰语).md#数组拼接成字符串) +### [字符串切分成数组](08_Zsh-开发指南(第八篇-变量修饰语).md#字符串切分成数组) +### [输出变量类型](08_Zsh-开发指南(第八篇-变量修饰语).md#输出变量类型) +- [字符串、数组或哈希表嵌套取值](08_Zsh-开发指南(第八篇-变量修饰语).md#字符串、数组或哈希表嵌套取值) +### [字符串内容作为变量名再取值](08_Zsh-开发指南(第八篇-变量修饰语).md#字符串内容作为变量名再取值) +### [对齐或截断数组中的字符串](08_Zsh-开发指南(第八篇-变量修饰语).md#对齐或截断数组中的字符串) +### [总结](08_Zsh-开发指南(第八篇-变量修饰语).md#总结) +### [参考](08_Zsh-开发指南(第八篇-变量修饰语).md#参考) +## [第九篇 函数和脚本](09_Zsh-开发指南(第九篇-函数和脚本).md) +### [导读](09_Zsh-开发指南(第九篇-函数和脚本).md#导读) +### [函数定义](09_Zsh-开发指南(第九篇-函数和脚本).md#函数定义) +### [参数处理](09_Zsh-开发指南(第九篇-函数和脚本).md#参数处理) +### [函数嵌套](09_Zsh-开发指南(第九篇-函数和脚本).md#函数嵌套) +### [返回值](09_Zsh-开发指南(第九篇-函数和脚本).md#返回值) +### [局部变量](09_Zsh-开发指南(第九篇-函数和脚本).md#局部变量) +### [脚本](09_Zsh-开发指南(第九篇-函数和脚本).md#脚本) +### [exit 命令](09_Zsh-开发指南(第九篇-函数和脚本).md#exit-命令) +### [用 getopts 命令处理命令行选项](09_Zsh-开发指南(第九篇-函数和脚本).md#用-getopts-命令处理命令行选项) +### [总结](09_Zsh-开发指南(第九篇-函数和脚本).md#总结) +### [参考](09_Zsh-开发指南(第九篇-函数和脚本).md#参考) +### [更新历史](09_Zsh-开发指南(第九篇-函数和脚本).md#更新历史) +## [第十篇 文件查找和批量处理](10_Zsh-开发指南(第十篇-文件查找和批量处理).md) +### [导读](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#导读) +### [简单例子](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#简单例子) +### [按文件属性查找](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#按文件属性查找) +### [通配符修饰语列表](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#通配符修饰语列表) +### [更复杂的用法](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#更复杂的用法) +- [按文件时间查找文件](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#按文件时间查找文件) +- [按文件大小查找文件](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#按文件大小查找文件) +- [文件排序](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#文件排序) +- [组合使用](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#组合使用) +### [文件批量重命名](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#文件批量重命名) +### [不展开通配符](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#不展开通配符) +### [总结](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#总结) +### [参考](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#参考) +### [更新历史](10_Zsh-开发指南(第十篇-文件查找和批量处理).md#更新历史) +## [第十一篇 变量的进阶内容](11_Zsh-开发指南(第十一篇-变量的进阶内容).md) +### [导读](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#导读) +### [typeset 命令](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#typeset-命令) +### [强制字符串内容为小写或者大写](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#强制字符串内容为小写或者大写) +### [设置变量为环境变量](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#设置变量为环境变量) +### [设置变量为只读变量](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#设置变量为只读变量) +### [设置数组不包含重复元素](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#设置数组不包含重复元素) +### [设置整数的位数](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#设置整数的位数) +### [进制转换](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#进制转换) +### [同时对多个变量赋相同的值](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#同时对多个变量赋相同的值) +### [绑定字符串和数组](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#绑定字符串和数组) +### [显示变量的定义方式](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#显示变量的定义方式) +### [什么地方该加双引号](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#什么地方该加双引号) +### [总结](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#总结) +### [参考](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#参考) +### [更新历史](11_Zsh-开发指南(第十一篇-变量的进阶内容).md#更新历史) +## [第十二篇 [[ ]] 的用法](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md) +### [导读](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#导读) +### [比较字符串](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#比较字符串) +### [判断文件](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#判断文件) +### [比较文件](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#比较文件) +### [比较数值](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#比较数值) +### [组合使用](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#组合使用) +### [[ ] 符号](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#[-]-符号) +### [总结](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#总结) +### [参考](12_Zsh-开发指南(第十二篇-[[-]]-的用法).md#参考) +## [第十三篇 管道和重定向](13_Zsh-开发指南(第十三篇-管道和重定向).md) +### [导读](13_Zsh-开发指南(第十三篇-管道和重定向).md#导读) +### [管道](13_Zsh-开发指南(第十三篇-管道和重定向).md#管道) +### [关于管道的更多细节](13_Zsh-开发指南(第十三篇-管道和重定向).md#关于管道的更多细节) +### [重定向](13_Zsh-开发指南(第十三篇-管道和重定向).md#重定向) +### [更多重定向的用法](13_Zsh-开发指南(第十三篇-管道和重定向).md#更多重定向的用法) +### [命名管道](13_Zsh-开发指南(第十三篇-管道和重定向).md#命名管道) +### [exec 命令的用法](13_Zsh-开发指南(第十三篇-管道和重定向).md#exec-命令的用法) +### [总结](13_Zsh-开发指南(第十三篇-管道和重定向).md#总结) +### [参考](13_Zsh-开发指南(第十三篇-管道和重定向).md#参考) +### [更新历史](13_Zsh-开发指南(第十三篇-管道和重定向).md#更新历史) +## [第十四篇 文件读写](14_Zsh-开发指南(第十四篇-文件读写).md) +### [导读](14_Zsh-开发指南(第十四篇-文件读写).md#导读) +### [写文件](14_Zsh-开发指南(第十四篇-文件读写).md#写文件) +- [创建文件](14_Zsh-开发指南(第十四篇-文件读写).md#创建文件) +- [清空文件](14_Zsh-开发指南(第十四篇-文件读写).md#清空文件) +- [删除文件](14_Zsh-开发指南(第十四篇-文件读写).md#删除文件) +- [多行文本写入](14_Zsh-开发指南(第十四篇-文件读写).md#多行文本写入) +- [用 mapfile 读写文件](14_Zsh-开发指南(第十四篇-文件读写).md#用-mapfile-读写文件) +- [从文件中间位置写入](14_Zsh-开发指南(第十四篇-文件读写).md#从文件中间位置写入) +### [读文件](14_Zsh-开发指南(第十四篇-文件读写).md#读文件) +- [读取整个文件](14_Zsh-开发指南(第十四篇-文件读写).md#读取整个文件) +- [按行遍历文件](14_Zsh-开发指南(第十四篇-文件读写).md#按行遍历文件) +- [读取指定行](14_Zsh-开发指南(第十四篇-文件读写).md#读取指定行) +- [读取文件到数组](14_Zsh-开发指南(第十四篇-文件读写).md#读取文件到数组) +- [读取指定数量的字符](14_Zsh-开发指南(第十四篇-文件读写).md#读取指定数量的字符) +- [向文件中间插入内容](14_Zsh-开发指南(第十四篇-文件读写).md#向文件中间插入内容) +### [总结](14_Zsh-开发指南(第十四篇-文件读写).md#总结) +## [第十五篇 进程与作业控制](15_Zsh-开发指南(第十五篇-进程与作业控制).md) +### [导读](15_Zsh-开发指南(第十五篇-进程与作业控制).md#导读) +### [在子进程中执行代码](15_Zsh-开发指南(第十五篇-进程与作业控制).md#在子进程中执行代码) +### [在后台运行进程](15_Zsh-开发指南(第十五篇-进程与作业控制).md#在后台运行进程) +### [在脚本中使用后台进程执行代码](15_Zsh-开发指南(第十五篇-进程与作业控制).md#在脚本中使用后台进程执行代码) +### [信号](15_Zsh-开发指南(第十五篇-进程与作业控制).md#信号) +### [总结](15_Zsh-开发指南(第十五篇-进程与作业控制).md#总结) +## [第十六篇 alias 和 eval 的用法](16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md) +### [导读](16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md#导读) +### [alias](16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md#alias) +### [eval](16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md#eval) +### [总结](16_Zsh-开发指南(第十六篇-alias-和-eval-的用法).md#总结) +## [第十七篇 使用 socket 文件和 TCP 实现进程间通信](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md) +### [导读](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md#导读) +### [Socket 文件](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md#Socket-文件) +### [TCP](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md#TCP) +### [程序样例](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md#程序样例) +### [总结](17_Zsh-开发指南(第十七篇-使用-socket-文件和-TCP-实现进程间通信).md#总结) +## [第十八篇 更多内置模块的用法](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md) +### [导读](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#导读) +### [模块的使用方法](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#模块的使用方法) +### [日期时间相关模块](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#日期时间相关模块) +### [读写 gdbm 数据库](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#读写-gdbm-数据库) +### [调度命令](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#调度命令) +### [底层的文件读写命令](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#底层的文件读写命令) +### [其他模块](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#其他模块) +### [自己编写模块](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#自己编写模块) +### [总结](18_Zsh-开发指南(第十八篇-更多内置模块的用法).md#总结) +## [第十九篇 脚本实例讲解](19_Zsh-开发指南(第十九篇-脚本实例讲解).md) +### [导读](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#导读) +### [实例一:复制一个目录的目录结构](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例一:复制一个目录的目录结构) +### [实例二:寻找不配对的文件](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例二:寻找不配对的文件) +### [实例三:用 sed 批量重命名文件](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例三:用-sed-批量重命名文件) +### [实例四:根据文件的 md5 删除重复文件](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例四:根据文件的-md5-删除重复文件) +### [实例五:转换 100 以内的汉字数字为阿拉伯数字](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例五:转换-100-以内的汉字数字为阿拉伯数字) +### [实例六:为带中文汉字数字的文件名重命名成以对应数字开头](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#实例六:为带中文汉字数字的文件名重命名成以对应数字开头) +### [总结](19_Zsh-开发指南(第十九篇-脚本实例讲解).md#总结) diff --git a/maketoc b/maketoc new file mode 100644 index 0000000..4e8fc73 --- /dev/null +++ b/maketoc @@ -0,0 +1,15 @@ +#!/bin/zsh + +echo "# Zsh 开发指南 目录" + +for filename (*Zsh-开发指南(第*md) { + local title=${${${filename#*(}%)*}//-/ } + echo "## [$title]("$filename")" + + for i (${(f)"$(grep "^###" $filename)"}) { + local level=${i%% *} + local subtitle=${i#$level } + [[ $level == "####" ]] && level="- " + echo "$level [$subtitle]("$filename"#${subtitle// /-})" + } +}