一、前言
学习 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
执行结果:
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 inls /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
这样写是合法的,但注意,第二次赋值的时候不能写)。
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 反过来)作为结束标记。
结构:
case 值 in
模式一)
...一操作...
;;
模式二)
...二操作...
;;
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
执行结果:
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 "<<<<<<<< 恭喜您,完成本次执行! >>>>>>>>"
执行结果:
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 自动化推送本地分支到远程仓库的程序(自己使用中,能够根据公司业务场景编写相应的脚本执行程序,替代重复性的无脑劳动,从而提高开发效率。)加油 !