为大作业编写简单的shell脚本

起因

对大作业选择刷100道leetcode的同学,老师的要求是

把100段代码和解释心得贴到一个md文档或其它格式文档。比如cat *.cpp>ans.md

然而,一来呢,我并没有在文件内标注题目和题干,这样做会分不清哪题是哪题;二来呢,把代码直接输入到markdown文档中显示会很丑(因为没有写代码框)

所以我现学现卖,上网查了查shell脚本的语法,看着还行,就决定自己编写一个脚本来处理这个问题

目标

  • 由于题目写在文件名里,所以应该是先输出文件名再输出文件内容
  • 文件的内容应该是按照题号排序的
  • 对文件的内容进行标注,即放在代码块里
  • 由于题目数量还在更新,所以应该在文件开头标注日期和题目数

实现思路

删除之前的answer.md->获得当前日期和目录下的cpp文件数目,写入answer.md->扫描当前目录->对每一cpp个文件,先输出文件名->然后加上代码框,即开头加上```cpp->输出文件内容(遍历每一行并输出)->在每个文件末尾追加```作为代码框的结束

代码及注释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
#使用该脚本,只需修改下一行的文件夹为你存放源文件的文件夹即可
cd ~/leetcode #进入文件所在的文件夹
IFS=$'\n' #将分隔符设置为换行
rm -rf answer.md #如果有,删除原来的md文档
count=$(find . -name '*.cpp' | wc -l) #获取cpp文件数目
echo -e "# 截至$(date '+%Y-%m-%d'),完成了$count题\n" >> answer.md #获取日期,记录
for file in `ls -v *.cpp` #遍历所有cpp文件,-v表示按版本排序,这里相当于按题号排序
do
echo -e "## $file\n" >> answer.md #输出文件名\n到md
echo -e "\`\`\`cpp" >> answer.md #输出```cpp作为代码框
for line in $(cat $file) #遍历文件的每一行并输出
do
echo "$line" >> answer.md
done
echo -e "\`\`\`\n" >> answer.md #代码框的结束
done

其中,#!/bin/bash指示这是一个用bash运行的shell脚本

folder是一个变量的,应当改为存放cpp文件的目录

然后删掉folder下的answer.md

接着用变量count记录cpp文件的数目,date记录当前的日期

输出日期题目数量到文件中

然后按题号顺序排序,来遍历每一个文件

输出文件名,输出```cpp,然后遍历并输出所有行,最后输出```作为代码框的结束

运行结果

先更改folder变量为目标目录,然后在终端下,输入bash leetcode.sh,就会在目录下生成需要的answer.md了

发布后如图(先锁起来了)

不过有点问题,因为行数实在太多了,在渲染的时候要花费大量的时间,也没有什么好办法,暂且这样吧

image-20220606232645496