欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

使用 shell 编写 git 自动化脚本

最编程 2024-03-14 14:09:39
...

一、前言

学习 shell 编程, 旨在工作过程中写相应的批量处理的 shell 脚本,以减少重复性的劳动,从而节省时间提高开发效率。学习 shell 源于日常对 git 的操作,因为日常 git 管理项目过程中,不断重复执行切换分支、提交工作区修改、拉取远程分支及将本地分支推送到远程分支,于是想着写个自动化处理的脚本来执行这些操作,从而提高开发效率。


由目标导向,实现git 自动化处理脚本布署, 也鉴于自身对 shell不熟悉 , 先学shell 语法。在学习过程中, 要结合目标导向, 能灵活运用 shell, 实现目标需求。

二、shell 语法

1. 注释

1.1 单行注释

# 开头的行就是注释, 会被解释器忽略

# author:小晰前端
# time:2022/9/22

1.2 多行注释

:<<EOF
作者: 小晰前端
时间: 2022/9/22
EOF

EOF 也可用其他字符代替

:<<'
作者: 小晰前端
时间: 2022/9/22
'

:<<!
作者: 小晰前端
时间: 2022/9/22
!

2. 输出

echo 命令

!#!/bin/bash

# 1.输出字符串
echo "Hello Lushuixi!"

# 2.输出变量
read -p "请输入你的姓名:" name
echo $name
echo "哈喽, $name"
echo "你好, ${name}"

# 3.输出换行
echo -e "OK! \n" # -e 开启转义, \c 不换行
echo "It is a test"

# 4.不输出换行
echo -e "OK! \c" # -e 开启转义, \c 不换行
echo "It is a test"

# 5.显示命令执行结果, 反引号
echo `date`

# 6.原样输出字符串, 不进行转义或取变量(用单引号)
echo '$name\'

# 7.显示结果定向至文件
echo "It is a test" > myFile.js

执行结果:

image.png

3. 输入

read 命令

参数 说明 示例
-p 指定提示语 read -p "请输入你的姓名" name
-t 指定等待输入的秒数, 当计时满时, read 命令返回一个非零退出状态 read -t 5 $name
-n 指定输入的字符数量, 当输入的字符数目达到预定数目时, 自动退出 read -n3 name
-s 使输入的数据不显示在命令终端上(实际上, 数据都是显示的, 只是 read 命令将文本颜色设置成与背景相同的颜色), 输入密码时常用这个选项 read -p "请输入密码:" -s password
#!/bin/bash

# 1. 简单输入
echo "请输入你的姓名:"
read name
echo "你输入的姓名: $name"

# 2. -p 参数
read -p "请输入你的姓名: " name
echo "你输入的姓名: $name"

# 3.  -t 参数
read -p "请输入你的姓名: " -t 5 name
echo "你输入的姓名: $name"

# 4. -n 参数
read -p "请输入你的姓名: " -n3 name
echo "你输入的姓名: $name"

# 5. -s 参数
read -p "请输入密码:" -s password
echo "你输入的密码: $password"

exit 0

读取文件: 每次调用 read 命令都会读取文件中的 "一行" 文本。当文件没有可读的行时,read 命令将以非零状态退出。通过什么样的方法将文件中的数据传给 read 呢?使用 cat 命令并通过管道将结果直接传送给包含 read 命令的 while 命令。

123
456
runoob

测试代码:

#!/bin/bash
  
count=1    # 赋值语句,不加空格
cat test.txt | while read line      # cat 命令的输出作为read命令的输入,read读到>的值放在line中
do
   echo "Line $count:$line"
   count=$[ $count + 1 ]          # 注意中括号中的空格。
done
echo "finish"
exit 0

执行结果:

Line 1:123
Line 2:456
Line 3:runoob
finish

4. 变量

4.1 定义变量

定义变量时, 变量名不加美元符号($), 如:

# 显式地直接赋值
your_name="小晰前端"

定义变量时注意事项:

  • 变量名和等号之间不能有空格, 否则执行时会报错command not found;
  • 命名只能使用英文字母, 数字和下划线, 且首个字符不能以数字开头;
  • 中间不能有空格, 可以使用下划线_;
  • 不能使用标点符号;
  • 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)

无效的命令示例:

  • ?a=123
  • 1a=123
  • a = 123

给变量赋值的两种方式:

  • 显式地直接赋值;
  • 用语句给变量赋值, 如将 /ect 下目录的文件名循环输出: for file in ls /etc 或 for file in $(ls /etc)`

4.2 使用变量

使用一个定义过的变量, 只要在变量名前面加上美元符号($)即可, 即:

your_name="小晰前端"
echo $your_name
echo ${your_name} # 变量名外面的花括号是可选的, 加不加都行(加花括号是为了帮助解释器识别变量的边界)

变量名外面加花括号是为了帮助解释器识别变量的边界

for skill in Ada Coffe Action Java; do
    # echo "I am good at ${skill}Script"
    # echo "I am good at $skill Script"
    echo "I am good at $skillScript" # 解释器会把skillScript当成一个变量(其值为空)
done

推荐给所有变量加上花括号,这是个好的编程习惯

已定义的变量仍然可以被重新定义

your_name="tom"
echo $your_name
your_name="alibaba"
echo $your_name

这样写是合法的,但注意,第二次赋值的时候不能写yourname="alibaba",使用变量的时候才加美元符(your_name="alibaba",使用变量的时候才加美元符()。

4.2.1 只读变量 readonly

使用 readonly 命令可以将变量定义为只读变量, 只读变量的值不能被改变。

myUrl="https://www.google.com"
readonly myUrl
myUrl="https://www.runoob.com"

声明了变量只读, 不能再输出、值不能被改变且不能被删除

4.2.2 删除变量 unset

使用 unset 命令可以删除变量, 语法:

your_name="小晰前端"
# unset your_name
unset your_name
echo $your_name

变量删除后不能再次使用, unset 命令不能删除只读变量

4.3 变量类型

运行 shell 时, 会同时存在三种变量:

  • 局部变量
  • 环境变量
  • shell 变量

具体类型:

  • 字符串类型: 可用单引号/双引号, 也可不用引号
    • 单引号里的任何字符都会原样输出, 其中应用的变量是无效的;
    • 双引号里可以有变量且可出现转义字符;
  • 数字类型
  • 布尔类型
4.3.1 字符串
#!/bin/bash

# 1.获取字符串的长度
# `${#string} 等价于 ${#string[0]}`

str="runoob is a great site"
echo $str
echo ${#str} # 4
echo ${#str[0]} #4

# 2.提取字符串
echo ${str:1:4} # 从第2个字符开始截取4个字符, 第一个字符的索引值为 0

# 3.查找字符串
# 查找字符 i 或 o 的位置(哪个字符先出现就计算哪个)
echo `expr index "$string" io`  # 输出 4

5. 运算符

6. 条件

if 开始, 以fi 结束条件语句。

如果 if/elif 条件then 在同一行, 则中间需加分号 ;if/elif 条件;then

6.1 if...else

结构:

if 条件 # if 条件开始
then
    # 条件为真,执行
else
    # 条件为假,执行
fi # 条件结束

示例:

#!/bin/bash

read -p "请输入你的姓名: " name

if [ $name = "lsx" ]
then
    echo "哈喽, 露水晰!"
else
    echo "哈喽, 朋友!"
fi

6.2 if ... elif...

结构:

if 条件一
then 
    # 条件一为真,执行
elif 条件二
then
    # 条件二为真,执行
...
else
    # 上面条件均为假,执行
fi

6.3 条件判断常用示例

判断输入是否为空 if [ $name != "" ];

比较两值是否相等 if [ $d1 = $d2 ];

示例:

# author:小晰前端
# time:2022/9/26

# enviroment:windows
# 功能:自动编译并执行java

echo "<<<<<<<< 开始执行 >>>>>>>>"

execJava() {
    javac "$1.java"
    java "$1"
}

main() {
    if [ "$1" = "" ]
    then
        read -p "请输入要执行的java文件名称:" javaName
        if [ "$javaName" != "" ]
        then
            execJava javaName
        else
            echo "请输入非空的java文件名称, 可再次尝试"
        fi
    else
        execJava $1
    fi
}
main $1

echo "<<<<<<<< 执行结束 >>>>>>>>"

6.4 case ... esac

首先 case ... esac 为多选择语句, 是一种分支选择结构。每个 case 分支用英文状态下的右括号开始, 用两个分号(;;)表示 break, 即执行结束, 跳出整个 case ... es 语句, 以esac(就是 case 反过来)作为结束标记。

结构:

casein
模式一)
    ...一操作...
    ;;
模式二)
    ...二操作...
    ;;
esac

示例:

case $execOption in
    [cC]|checkout)
        # 切换分支
        execCheckout
        ;;
    [pP][uU][lL][lL])
        # 拉取远程分支代码
        execPull
        ;;
    [pP][uU][sS][hH])
        # 推送本地分支到远程分支
        execPush
        ;;
    [hH][eE][lL][pP])
        # 帮助手册阅览
        read -p "请输入命令: " exec
        confirmContinue $exec
        ;;
    [eE]|[eE][xX][iI][tT])
        echo "<<<<<<<< 中断程序执行 >>>>>>>>"
        exit 1
        ;;
esac

6.5 其他条件判断

未完待续~

7. 循环

7.1 while 语句

未完待续~

8. 函数

函数定义格式:

[ funciton ] funname [()]
{
    action;
    [return init;]
}

说明:

  • 可以带 funciton fun() 定义, 也可以直接 fun() 定义, 不带任何参数;
  • 参数返回, 可以显示加: return 返回, 如果不加, 将以最后一条命令运行结果, 作为返回值

例如:

#!/bin/bash

# author:小晰前端
# time:2022/9/22

# 1. 简单函数
sayHello(){
    echo "哈喽, 这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
sayHello
echo "-----函数执行完毕-----"

# 2.带 return 语句的函数
execAdd(){
    echo "这个函数会对输入的两个数字进行求和运算..."
    read -p "输入第一个数字: " aNum
    read -p "输入第二个数字: " anotherNum
    echo "两个数字分别为 $aNum$anotherNum !"
    return $(($aNum+$anotherNum))
}
execAdd
echo "输入的两个数字之和为 $? !" # 函数返回值在调用该函数后通过 $? 来获得

# 3.函数参数
# 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数..
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !" # $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。


注意: 函数传参时, 也可传入函数名称(在函数名称前不可加$, 否则会以变量去查找), 示例:

# push
execPush() {
    echo "正在执行 push 操作"
}

# 二次确认是否继续执行
confirmContinue() {
    echo "是否继续执行?【Y/n】"
    execMainOption $1 $2
}

# 主函数
execMainOption() {
    echo "执行main操作"
    confirmContinue $1 execPush # 给函数传入参数, 第二个参数是函数名称
}

execMainOption $1

使用函数后的 git 自动化布署

#!/bin/bash

# author:小晰前端
# time:2022/9/22

echo "<<<<<<<< 温馨提示: 请将该脚本放在与项目路径同级的文件中 >>>>>>>>"

# 如果当前工作区没有更改则无需继续进行
git status

# 确定是否要提交
read -r -p "是否继续提交?【Y/n】" input

execMainPush() {
    git add .
    git status

    # 输入提交说明
    read -p "请输入本次提交的备注说明:" commit
    echo "<<<<<<<< 将暂存区内容提交到本地仓库:开始 >>>>>>>>"
    git commit -m ${commit} --no-verify

    # 输入拉取远程仓库的分支名称
    read -p "请输入要拉取远程仓库的分支名称:" pullBranch
    if [ "$pullBranch" != "" ]
    then 
        echo "<<<<<<<< 拉取远程分支到本地仓库并合并:${pullBranch}开始 >>>>>>>>"
        git pull origin ${pullBranch}
    else
        git pull
    fi


    # 输入推到远程仓库的分支名称
    read -p "请输入要拉取远程仓库的分支名称:" pushBranch
    if [ "$pushBranch" != "" ]
    then 
        echo "<<<<<<<< 推送本地分支更到远程分支并合并:${pullBranch}开始 >>>>>>>>"
        git push origin ${pushBranch}
    else
        git push
    fi
}

case $input in
    [yY][eE][sS]|[yY])
        echo "继续提交"
        execMainPush # 调用函数
        echo "<<<<<<<< 恭喜您,本次推送完毕! >>>>>>>>"
        ;;
    [nN][oO]|[nN])
        echo "中断提交"
        exit 1
        ;;
esac

9. 传递参数

前面写的 git.sh 只有推送代码的, 现在我想调整下: 在输入执行脚本的命令后传入一个参数, 取值范围: c/checkout(切换分支),pull(拉取代码),push(推送代码, 默认值为push)。解释器拿到该参数, 结合 case in 语句, 进入相应的分支里执行相应的程序, 或切换分支, 或拉取远程分支代码, 或推送到远程分支。

基于这样的需求, 下面学下 shell 是如何接收参数的。

在执行脚本时, 向脚本传递参数, 脚本内获取参数的格式为: $n。

n 代表一个数字, 1 为执行脚本的第一个参数, 2为执行脚本的第二个参数, 以此类推... 其中 0 代表执行的脚本的文件名(包含文件路径)

#!/bin/bash

# author:小晰前端
# time:2022/9/22

echo "<<<<<<<< Git自动化布署开始 >>>>>>>>"
# echo $0
# echo $1

defaultOption="help"
execOption=$1
if [ "$1" = "" ]
then
    execOption=$defaultOption # 赋默认值
fi

case $execOption in
    [cC]|checkout)
        echo "切换分支"
        ;;
    [pP][uU][lL][lL])
        echo "拉取远程分支代码"
        ;;
    [pP][uU][sS][hH])
        echo "推送本地分支到远程分支"
        ;;
    [hH][eE][lL][pP])
        echo "-------- 帮助手册阅览 --------"
        echo "--------    输入 c/checkout 切换分支    --------"
        echo "--------    输入 pull 拉取远程分支代码    --------"
        echo "--------    输入 push 推送本地分支到远程分支   --------"
        echo "--------    输入 exit 退出当前程序   --------"
        echo "--------    输入 help 查看帮助手册    --------"
        echo "-------- 帮助手册结束 --------"
        echo ""
        read -p "请输入命令: " exec
        echo "当前执行命令: $exec"
        ;;
    [eE]|[eE][xX][iI][tT])
        echo "终端程序执行"
        exit 1
        ;;
esac

"<<<<<<<< 恭喜您,完成本次执行! >>>>>>>>"

这样就根据输入的参数不同, 执行相应的程序, 从而达成所愿。但是, 如果第一入参是 help, 允许用户二次输入命令, 输入命令后重新走 case in 流程。所以,将 case in 这部分代码放入函数 execMainOption, 调整如下:


... 此处省略...

execMainOption() {
    # echo $0
    # echo $1
    
    # 此处省略上述 case in 代码块
    ... case in ...
    case $1 in
        
}

execMainOption $execOption # 函数传参, 传入命令行第一个参数

整体调整后程序看尾巴(二期需求)~


注意: 函数接收参数脚本接收命令行参数格式相同

接收

三、应用

1. git 自动化布署脚本

1.1 一期需求

首先执行 git status, 能够清楚的知道当前工作区是否有修改。做了二次确认, 确认是否继续提交这些变化, 如果需要在提交前对这些变化进行处理, 可输入 no 结束流程。如果确认提交, 则执行后续流程。

#!/bin/bash

# author:小晰前端
# time:2022/9/21

# git 自动化部署脚本
# 切换分支
# 拉取代码
# 推代码

# 在 git bash 执行命令: sh git.sh / ./git.sh
# 1. git add . 将当前工作区的修改写入到暂存区
# 2. git commit -m "2022.9.21" --no-verify 双引号里面的内容等待用户输入 | 将暂存区内容添加到本地仓库
# 3. git pull origin 分支 由用户指定分支,默认当前分支 | 拉取远程分支到本地
# 4. 如果有冲突, 则停止脚本的运行, 由用户去处理冲突, 冲突处理完, 从头执行
# 5. git push origin 分支 由用户指定分支,默认当前分支 | 将本地的分支版本上传到远程并合并

echo "<<<<<<<< 温馨提示: 请将该脚本放在与项目路径同级的文件中 >>>>>>>>"

# 如果当前工作区没有更改则无需继续进行
git status

# 确定是否要提交
read -r -p "是否继续提交?【Y/n】" input

case $input in
    [yY][eE][sS]|[yY])
        echo "继续提交"

        git add .
        git status

        # 输入提交说明
        read -p "请输入本次提交的备注说明:" commit
        echo "<<<<<<<< 将暂存区内容提交到本地仓库:开始 >>>>>>>>"
        git commit -m ${commit} --no-verify

        # 输入拉取远程仓库的分支名称
        read -p "请输入要拉取远程仓库的分支名称:" pullBranch
        if [ "$pullBranch" != "" ]
        then 
            echo "<<<<<<<< 拉取远程分支到本地仓库并合并:${pullBranch}开始 >>>>>>>>"
            git pull origin ${pullBranch}
        else
            git pull
        fi


        # 输入推到远程仓库的分支名称
        read -p "请输入要拉取远程仓库的分支名称:" pushBranch
        if [ "$pushBranch" != "" ]
        then 
            echo "<<<<<<<< 推送本地分支更到远程分支并合并:${pullBranch}开始 >>>>>>>>"
            git push origin ${pushBranch}
        else
            git push
        fi

        echo "<<<<<<<< 恭喜您,本次推送完毕! >>>>>>>>"
        ;;
    [nN][oO]|[nN])
        echo "中断提交"
        exit 1
        ;;
esac

执行命令:

git bash 上输入 sh git.sh./git.sh

执行结果:

image.png

1.2 二期需求

#!/bin/bash

# author:小晰前端
# time:2022/9/21

echo "<<<<<<<< Git自动化布署开始 >>>>>>>>"
# echo $0
# echo $1

defaultOption="help"

# 二次确认是否继续执行
confirmContinue() {
    read -p "是否继续执行?【Y/n】" hasContinue
    case $hasContinue in
        [yY][eE][sS]|[yY])
            echo "继续执行"
            execMainOption $1
            ;;
        [nN][oO]|[nN])
            echo "<<<<<<<< 中断程序执行 >>>>>>>>"
            exit 1
            ;;
    esac
}

# 主函数
execMainOption() {
    # echo $0
    echo "参数: $1"

    # 保证每次执行主函数第一个参数都非空
    execOption=$1
    if [ "$1" = "" ]
    then
        execOption=$defaultOption # 赋默认值
    fi  

    # echo "execOption: $execOption"

    case $execOption in
        [cC]|checkout)
            echo "切换分支"
            # 未完待续~
            ;;
        [pP][uU][lL][lL])
            echo "拉取远程分支代码"
            # 未完待续~
            ;;
        [pP][uU][sS][hH])
            echo "推送本地分支到远程分支"
            # 执行一期程序
            ;;
        [hH][eE][lL][pP])
            echo "-------- 帮助手册阅览 --------"
            echo "--------    输入 c/checkout 切换分支    --------"
            echo "--------    输入 pull 拉取远程分支代码    --------"
            echo "--------    输入 push 推送本地分支到远程分支   --------"
            echo "--------    输入 exit 退出当前程序   --------"
            echo "--------    输入 help 查看帮助手册    --------"
            echo "-------- 帮助手册结束 --------"
            echo ""
            read -p "请输入命令: " exec
            confirmContinue $exec
            # execMainOption $exec
            ;;
        [eE]|[eE][xX][iI][tT])
            echo "<<<<<<<< 中断程序执行 >>>>>>>>"
            exit 1
            ;;
    esac
}

execMainOption $1 # 函数传参, 传入命令行第一个参数

echo "<<<<<<<< 恭喜您,完成本次执行! >>>>>>>>"

执行结果:

image.png

1.3 三期改造

echo "<<<<<<<< Git自动化布署开始 >>>>>>>>"

...此处省略...

# 主函数
execMainOption() {
    # 保证每次执行主函数第一个参数都非空
    execOption=$1
    if [ "$1" = "" ]
    then
        execOption=$defaultOption # 赋默认值
    fi  

    case $execOption in
        [nN]|[nN][eE][wW])
            echo "新建分支并切换"
            confirmContinue execCheckoutNew
            ;;
        [cC]|checkout)
            echo "切换分支"
            confirmContinue execCheckout
            ;;
        [pP][uU][lL][lL])
            echo "拉取远程分支代码"
            execPull
            ;;
        [pP][uU][sS][hH])
            echo "推送本地分支到远程分支"
            execPush
            ;;
        [hH][eE][lL][pP])
            echo "-------- 帮助手册阅览 --------"
            echo "--------    输入 c/checkout 切换分支    --------"
            echo "--------    输入 c/checkout 切换分支    --------"
            echo "--------    输入 pull 拉取远程分支代码    --------"
            echo "--------    输入 push 推送本地分支到远程分支   --------"
            echo "--------    输入 exit 退出当前程序   --------"
            echo "--------    输入 help 查看帮助手册    --------"
            echo "-------- 帮助手册结束 --------"
            echo ""
            read -p "请输入命令: " exec
            confirmContinue execMainOption $exec # 函数传参: 第一个参数是回调函数 第二个是回调函数需要的参数
            ;;
        [eE]|[eE][xX][iI][tT])
            execExit
            ;;
    esac
}

execMainOption $1 # 函数传参, 传入命令行第一个参数

echo "<<<<<<<< 恭喜您,完成本次执行! >>>>>>>>"

优化版本:

echo "<<<<<<<< Git自动化布署开始 >>>>>>>>"

defaultOption="help"

# exit
execExit() {
    echo "<<<<<<<< 中断程序执行 >>>>>>>>"
    exit 1
}

# 新建分支
checkoutNewBranch() {
    read -p "请输入要新建的分支名称:" newBrach
    if [ "$newBrach" != ""]
    then
        git checkout -b ${newBrach}
    else
        echo "输入值为空"
        execExit
    fi
}

# 切换分支
checkoutBranch() {
    # 输入提交说明
    read -p "请输入要切换的分支:" branchName
    git checkout ${branchName}
}

# 拉取远程仓库分支代码
pullRepo() {
    git add .
    git status

    # 输入提交说明
    read -p "请输入本次提交的备注说明:" commit
    echo "<<<<<<<< 将暂存区内容提交到本地仓库:开始 >>>>>>>>"
    git commit -m ${commit} --no-verify

    # 输入拉取远程仓库的分支名称
    read -p "请输入要推送到远程仓库的分支名称:" pullBranch
    if [ "$pullBranch" != "" ]
    then 
        echo "<<<<<<<< 拉取远程分支到本地仓库并合并:${pullBranch}开始 >>>>>>>>"
        git pull origin ${pullBranch}
    else
        git pull
    fi
}

# 推送到远程分支代码
pushRepo() {
    pullRepo

    # 输入推到远程仓库的分支名称
    read -p "请输入要拉取远程仓库的分支名称:" pushBranch
    if [ "$pushBranch" != "" ]
    then 
        echo "<<<<<<<< 推送本地分支更到远程分支并合并:${pullBranch}开始 >>>>>>>>"
        git push origin ${pushBranch}
    else
        git push
    fi
}

# 执行新建分支
execCheckoutNew() {
    git status
    confirmContinue checkoutNewBranch new
}

# 执行切换
execCheckout() {
    git status
    confirmContinue checkoutBrach checkout
}

# 执行拉取
execPull() {
    git status
    confirmContinue pullRepo pull
}

# 执行推送
execPush() {
    git status
    confirmContinue pushRepo push
}

# 二次确认是否继续执行
confirmContinue() {
    read -p "是否继续执行$2操作?【Y/n】" hasContinue
    case $hasContinue in
        [yY][eE][sS]|[yY])
            echo "继续执行"
            # execMainOption $1
            $1 $2
            ;;
        [nN][oO]|[nN])
            echo "<<<<<<<< 中断程序执行 >>>>>>>>"
            exit 1
            ;;
    esac
}

# 主函数
execMainOption() {
    # echo $0
    echo "参数: $1"

    # 保证每次执行主函数第一个参数都非空
    execOption=$1
    if [ "$1" = "" ]
    then
        execOption=$defaultOption # 赋默认值
    fi  

    echo "execOption: $execOption"

    case $execOption in
        [nN]|[nN][eE][wW])
            echo "新建分支并切换"
            execCheckoutNew
            ;;
        [cC]|checkout)
            echo "切换分支"
            execCheckout
            ;;
        [pP][uU][lL][lL])
            echo "拉取远程分支代码"
            execPull
            ;;
        [pP][uU][sS][hH])
            echo "推送本地分支到远程分支"
            execPush
            ;;
        [hH][eE][lL][pP])
            echo "-------- 帮助手册阅览 --------"
            echo "--------    输入 c/checkout 切换分支    --------"
            echo "--------    输入 c/checkout 切换分支    --------"
            echo "--------    输入 pull 拉取远程分支代码    --------"
            echo "--------    输入 push 推送本地分支到远程分支   --------"
            echo "--------    输入 exit 退出当前程序   --------"
            echo "--------    输入 help 查看帮助手册    --------"
            echo "-------- 帮助手册结束 --------"
            echo ""
            read -p "请输入命令: " exec
            # confirmContinue execMainOption $exec # 函数传参: 第一个参数是回调函数 第二个是回调函数需要的参数
            execMainOption $exec
            ;;
        [eE]|[eE][xX][iI][tT])
            execExit
            ;;
    esac
}

execMainOption $1 # 函数传参, 传入命令行第一个参数

echo "<<<<<<<< 恭喜您,完成本次执行! >>>>>>>>"

四、总结

shell 语法较为简练,当前的学习还比较粗陋。了解了 shell 语法的简易使用,根据日常 git 操作流程编写一个出版的 git 自动化推送本地分支到远程仓库的程序(自己使用中,能够根据公司业务场景编写相应的脚本执行程序,替代重复性的无脑劳动,从而提高开发效率。)加油 !

五、参考文献

shell