【Slog】shell编程基础——函数 & gitlab多project克隆
在编程语言中使用函数或者方法来代替一些重复性的工作,是极其方便的。同时这也是面向对象编程中类的继承如此重要的原因,都是为了一个词——复用。
在shell编程中函数本身其实就是一个子脚本,执行特定任务的“黑盒子”
以下为本文的目录结构(非链接跳转)
函数语法格式
格式一
function function_name {
command...
}
格式二
function_name () {
command...
}
第二种格式因为更像是C语言,所以其具备更强的可移植性。往往也更受欢迎,在下面的实例中也主要使用这种方式
函数的调用
在知道了函数如何定义之后,剩下的就是如何进行函数调用了。非参数函数,只需要使用其函数名就可完成调用。带参数的函数如何定义和调用在下一小节进行说明。
带参数的函数
定义
#!/bin/bash
myHeart() {
echo "$1$2"
}
echo "Who do you fall in love with?"
myHeart "you" "!!!!"
myHeart "No," "you are liar!!"
如上图和代码所示
- 定义函数需要传入参数的时候,直接使用、2....$x即可。但需要注意的是两位数以上需要加上{}来进行限定,不然会识别为该数字的第一个数字,而非这个数字整体
调用
将函数参数化之后,必须要面临的问题是。在调用该函数的时候需要传入相应的参数,在shell编程中,这还是比较简单的。直接在函数数名后边跟上相应的参数即可(不同的参数需要使用“空格”隔开)。如下图所示
gitlab多project克隆
在用gitlab进行项目管理的时候,需要通过group和project的组合来进行权限粒度的细分。让相应权限的人只能看见他自己的项目代码。但是这就带来了一个问题,git中是将一个项目当成一个整体库来进行管理的。如果我要进行权限控制,必定意味着同一项目下将会有多个porject存在。这时候我需要建立相应的目录一个个的进行clone,这是一个麻烦的事情。此处可以通过脚本来clone所有的project下来,并建立相应的目录结构。
为了实现这个目标,其使用一共有两种思路。
思路一
使用过git的小伙伴应该知道,如果clone项目使用**“git clone+库地址”** 这条指令即可,但实际上它还可以添加路径在后边,如 “git clone+库地址+本地放置路径”。所以思路一中使用一个cloneRepo的函数就可完成多project克隆。 文件结构和具体代码如下:
#!/bin/bash
cloneRepo(){
git clone $2 $1
}
# folder_path
main=main
design=main/design
env=main/env
wave=main/wave
log=main/log
# repo_path
mainRepo=git@xxx
designRepo=git@xxx
envRepo=git@xxx
waveRepo=git@xxx
logRepo=git@xxx
cloneRepo $design $designRepo
cloneRepo $env $envRepo
cloneRepo $wave $waveRepo
cloneRepo $log $logRepo
思路二
思路一虽然方便,但是会遇见一个问题。如果该文件结构已经存在将会直接报出fatal,所以我们需要将采用另一个思路来完成clone所有project的任务。即先建立文件结构,再在对应的目录下clone项目。
这里会出现一个问题,如/home/lsf/git_repo/main/design/design,即直接clone其会自动建立一个跟项目同名的文件来放置项目文件。此处采用的处理方式是,将design下的内容copy到上一层design文件夹下,然后删除最底层的design。所以还往该函数里边传入了项目名的参数,即$3。
#!/bin/bash
createFolder(){
if [ -d $1 ]
then
echo "$1 ----> Already Exists !!!!"
else
mkdir $1
echo -n "$PWD";echo "/$1 ----> Create Successful !!!!"
fi
}
baseFolder=$PWD
cloneRepo(){
cd $1
git clone $2
cd -r $3/. ./
rm -rf $3
cd $baseFolder
}
# folder_path
main=main
design=main/design
env=main/env
wave=main/wave
log=main/log
#mkdir
createFolder $main
createFolder $design
createFolder $env
createFolder $wave
createFolder $log
# repo_path
mainRepo=git@xxx
designRepo=git@xxx
envRepo=git@xxx
waveRepo=git@xxx
logRepo=git@xxx
cloneRepo $design $designRepo design
cloneRepo $env $envRepo env
cloneRepo $wave $waveRepo wave
cloneRepo $log $logRepo log
- Tips: group层级只需要目录结构,而不能clone
本小节结束,待更新。。。
参考资料
- 菜鸟教程——shell教程
- 实验楼课程——高级 Bash 脚本编程指南
- 《Linux命令行与shell脚本编程大全(第三版)》 Richard Blum & Christine Bresnahan
- 《Linux Shell脚本攻略(第二版)》 [印] Shantanu Tushar / [印] Sarath Lakshman
- Advanced Bash-Scripting Guide Mendel Cooper