shell 函数_【Slog】shell编程基础——函数 & gitlab多project克隆

【Slog】shell编程基础——函数 & gitlab多project克隆

在编程语言中使用函数或者方法来代替一些重复性的工作,是极其方便的。同时这也是面向对象编程中类的继承如此重要的原因,都是为了一个词——复用

在shell编程中函数本身其实就是一个子脚本,执行特定任务的“黑盒子”

以下为本文的目录结构(非链接跳转)

9d77a5d3150f6a1bb4419867394bc69b.png

函数语法格式

格式一

function function_name {
command...
}

格式二

function_name () { 
command...
}

第二种格式因为更像是C语言,所以其具备更强的可移植性。往往也更受欢迎,在下面的实例中也主要使用这种方式

函数的调用

在知道了函数如何定义之后,剩下的就是如何进行函数调用了。非参数函数,只需要使用其函数名就可完成调用。带参数的函数如何定义和调用在下一小节进行说明。

ed9c7060f9f92439ac78a0e24d57ed1a.png

带参数的函数

定义

#!/bin/bash

myHeart() {
    echo "$1$2"
}

echo "Who do you fall in love with?"

myHeart "you" "!!!!"

myHeart "No," "you are liar!!"

4ec7ee42342aca3f8fe5422577d7dc37.png

如上图和代码所示

  • 定义函数需要传入参数的时候,直接使用、2....$x即可。但需要注意的是两位数以上需要加上{}来进行限定,不然会识别为该数字的第一个数字,而非这个数字整体

调用

将函数参数化之后,必须要面临的问题是。在调用该函数的时候需要传入相应的参数,在shell编程中,这还是比较简单的。直接在函数数名后边跟上相应的参数即可(不同的参数需要使用“空格”隔开)。如下图所示

c20d9dc93f06a3efbe661d52bcb96b10.png

gitlab多project克隆

用gitlab进行项目管理的时候,需要通过group和project的组合来进行权限粒度的细分。让相应权限的人只能看见他自己的项目代码。但是这就带来了一个问题,git中是将一个项目当成一个整体库来进行管理的。如果我要进行权限控制,必定意味着同一项目下将会有多个porject存在。这时候我需要建立相应的目录一个个的进行clone,这是一个麻烦的事情。此处可以通过脚本来clone所有的project下来,并建立相应的目录结构

为了实现这个目标,其使用一共有两种思路。

思路一

使用过git的小伙伴应该知道,如果clone项目使用**“git clone+库地址”** 这条指令即可,但实际上它还可以添加路径在后边,如 “git clone+库地址+本地放置路径”。所以思路一中使用一个cloneRepo的函数就可完成多project克隆。 文件结构和具体代码如下:

ca36f76039f2fde6eaedf1a36223e6e1.png
#!/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
56b88c4c04afffdeff8c6508b6574907.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值