1背景小故事和需求分析
scala生成三种文件.png最经在用
Chisel
写代码,可以通过Scala
文件生成.v
.fir
.anno.json
三个文件。但是是直接生成在根目录下的,下面放个图感受以下
看着就很乱!!现在想要通过一个Shell脚本去整理这些文件,把
root/src/main/scala/a.Scala
生成的root/a.v
root/a.fira
root/.anno.json
整理到root/src/module/a/
文件夹下面
2根据需求分步骤
2.1 shell脚本基本概念了解
shell脚本可以理解为一个可以一次执行多个linux命令行的东东,举个例子:下面是一个shell脚本的内容
#!/bin/bash
echo "hello world!"
mkdir nice
cd nice
很简单,第一行告诉终端,用/bin/bash
执行这个shell
文件。
第二行echo
输出hello world!
第三行mkdir
创建一个目录nice
并在第四行通过cd
进入这个目录。
2.2 shell脚本变量的使用
2.2.1 变量的声明
首先是变量的声明,代码放在下面。这边根据我的应用需求,定义了scala_root
和module_root
两个变量,scala_root
表示scala
代码存放的路径,module_root
表示我要把通过scala
代码生成的文件放到哪个目录下面
#!/bin/bash
scala_root="./src/main/scala"
module_root="./src/module"
echo "searching package in ${scala_root}"
2.2.2 变量的使用
前面声明的变量a
,可以通过${a}
来使用,下面还是举个例子,下面代码将执行ls ${scala_root}
,并且将返回结果for
迭代到package
变量中,聪明的铁子已经反映过来了,这一步就是进入路径的每一个文件包。
#!/bin/bash
scala_root="./src/main/scala"
module_root="./src/module"
echo "searching package in ${scala_root}"
for package in `ls ${scala_root}` ;do
# 进入路径下面的scala包
echo "now is at package: ${package}"
done
我来运行一下给铁子们看看,注意这边,创建完.sh
文件之后,记得sudo chmod +x yourFile.sh
给文件执行权限
2.2.3变量的处理(类似于字符串)
在上面的代码上,加了对package
的二次遍历,遍历里面的.scala
文件。字符串处理的一行内容是:class_name=${scala_class%.scala}
是将.scala
的后缀去掉。
截取函数的用法参考这个老哥的博客,写的很好Linux Shell 截取字符串
#!/bin/bash
scala_root="./src/main/scala"
module_root="./src/module"
echo "searching package in ${scala_root}"
for package in `ls ${scala_root}` ;do
# 进入路径下面的scala包
echo " now is at package: ${package}"
for scala_class in `ls ${scala_root}/${package}`;do
# 在包中找到对应的.scala文件,并且去除.scala后缀
module_name=${scala_class%.scala}
echo " module name is ${module_name}"
done
done
二层遍历文件.png
2.2.4 判断文件或文件夹是否存在
咱们现在已经可以获取module name
了,其实也就可以定位到a.scala
生成的a.v
a.fir
a.anno.json
文件了,下面就可以开始创建文件夹,把东西移动到一个文件夹下面了。
这个老哥的帖子写了shell bash判断文件或文件夹是否存在
# 在目标目录下面根据class名称创建文件夹
targetPath=${module_root}/${module_name}/
echo " mkdir ${targetPath}"
if [ ! -d ${targetPath} ];then
mkdir ${targetPath}
fi
上面代码先判断是否存在文件夹,再看是否需要创建文件夹
2.2.5函数的调用
function test(){
echo " moving $1 to $2"
}
test lala xixi
函数的基本写法
function [function name](){}
注意,shell的函数,传入参数不是直接写在括号里面的。看上面例子,可以通过$1 $2
进行访问第一个参数和第二个参数
上面代码的输出为moving lala to xixi
2.3最终版本!!
#!/bin/bash
scala_root="./src/main/scala"
module_root="./src/module"
echo "searching package in ${scala_root}"
function move_file(){
if [ -f $1 ];then
mv $1 $2
fi
echo " moving $1 to $2"
}
for package in `ls ${scala_root}` ;do
# 进入路径下面的scala包
echo " now is at package: ${package}"
for scala_class in `ls ${scala_root}/${package}`;do
# 在包中找到对应的.scala文件,并且去除.scala后缀
module_name=${scala_class%.scala}
echo " module name is ${module_name}"
# 在目标目录下面根据class名称创建文件夹
targetPath=${module_root}/${module_name}/
echo " make dir ${targetPath}"
if [ ! -d ${targetPath} ];then
mkdir ${targetPath}
fi
# 将主目录下面的一些输出文件移动到目标文件夹下面
move_file ${module_name}.v ${targetPath}
move_file ${module_name}.fir ${targetPath}
move_file ${module_name}.anno.json ${targetPath}
done
done
结果.png
目录结构.png
3 Reference
linux shell 自定义函数(定义、返回值、变量作用域)介绍
Linux Shell 截取字符串
shell bash判断文件或文件夹是否存在
网友评论