diff --git a/README.md b/README.md index ef5055a2b33666a5b84fedc28ab691a20b542ac3..db96c96ab3d1795bd515786ddd2beb9d8f48b7e6 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ # 软件架构 -使用 shell、awk 脚本编写 +使用 shell 脚本编写 @@ -32,7 +32,7 @@ ### 1、Git Tools -1. Batch Clone Project +1. **Batch Clone Project** ![image](./image/0003.png) @@ -40,9 +40,9 @@ - Git 基础 URL:`URL + /子组名称/项目名称 + .git` 组成 clone 项目的 HTTP URL - >注意:projects.txt 需要设置为 Unix(LF) 格式 + >注意:projects.txt 需要设置为 Unix(LF) 格式,**V3.0.0 实现自动转换为 LF** -1. Batch Checkout Branch +1. **Batch Checkout Branch** ![image](./image/0004.png) @@ -50,27 +50,51 @@ - 待切换的分支名称 -2. Batch Creating Branch +3. **Batch Creating Branch** ![image](./image/0005.png) - 创建新的分支:可以批量将 clone 到本地的所有项目创建相同的分支,需要根据提示填写两个参数 + 创建新的分支:可以批量将 clone 到本地的所有项目创建相同的分支,需要根据提示填写三个参数 - - 新分支名称 - - 参照分支名称 + - 目标分支:待创建的新分支名称 + - 参照源远程:创建新分支参照的远程名称, 不输入默认为 origin + - 参照分支名称:创建新分支参照的分支名称 -3. Batch Delect Remote Branch +3. **Batch Delete Remote Branch** ![image](./image/0006.png) - 需要配置脚本目录下 `config/retain-branches.txt` 文件,该文件用于配置需要保留的分支,文件中配置的分支和 master 分支将保留,其余分支会自动删除。 + 需要配置脚本目录下 `config/retain-branches.txt` 文件,该文件用于配置需要保留的分支,文件中配置的分支将保留(建议将受保护的分支配置到保留分支列表中),其余分支会自动删除。 -4. Batch Push Repository +5. **Batch Push Repository** ![image](./image/0007.png) 按照现在项目的分支和 remote origin push 到仓库 - + +6. Batch Add Remote + + ![image](./image/0012.png) + + 给项目批量添加一个名为 `upstream` 的 remote,只需要输入远程的 URL 即可。 + + > 注意: + > + > 待添加的远程组结构和名称要与 origin 的一致,否则会添加异常 + +7. Batch Synch Branch + + ![image](./image/0013.png) + + 这个组件有两个作用: + + - fork 项目:若 upstream 只有组结构,没有项目,执行该组件,相当于将项目 fork 到 upstream 中,但是只保留同步的分支,而且该分支为受保护的分支。作为 fork 项目使用,建议先同步 master 分支 + - 同步分支:将输入的分支同步到 upstream + + >注意: + > + >待添加的远程组结构和名称要与 origin 的一致,否则会添加异常 + ### 2、Project Tools diff --git a/component/Git Tools/Batch Add Remote/index.sh b/component/Git Tools/Batch Add Remote/index.sh new file mode 100644 index 0000000000000000000000000000000000000000..1dbd2601df8fc01955ed372bf3e5b3998ccba37c --- /dev/null +++ b/component/Git Tools/Batch Add Remote/index.sh @@ -0,0 +1,55 @@ +#!/bin/bash + +#========================================================================================= +# 作者:赵海春 +# 日期:2022.04.26 +# 作用:批量添加远程 +# 使用:在需要批量添加远程项目的脚本中通过以下步骤使用该脚本 +# 1、命令:. ./index.sh +# 2、配置环境变量:PROJECT_TARGET_PATH +#========================================================================================= + +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量添加远程 ┃" +echo -e "┃ Batch Add Remote ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Add Remote] 添加远程 ┃" +echo -e "┃ ┃" +echo -e "┃ 注意事项: ┃" +echo -e "┃ 远程和 origin 目录结构必须一样 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" + +# 以下变量读取的环境变量 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" + +# 当前脚本所在目录路径 +SCRIPT_PATH=$(pwd) +# 远程名称 +REMOTE_NAME="upstream" + + +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" + +echo "" +read -r -p "请输入远程 URL (http://ip:port/group): " REMOTE_BASE_URL +strIsBlank "${REMOTE_BASE_URL}" "请输入远程 URL, 添加远程失败!" + +function foreachGitProjects_run() { + echo -e "\n\e[34;7m添加远程: ${1} [${REMOTE_NAME}]\e[0m" + git remote add "${REMOTE_NAME}" "${REMOTE_BASE_URL}${1}.git" + checkFail "添加远程失败, 请检查后操作!" + git remote -v +} +foreachGitProjects + +cd "${SCRIPT_PATH}" +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Checkout Branch/index.sh b/component/Git Tools/Batch Checkout Branch/index.sh index 38b98fef6c8822dd76f752afcd2bcd26acfe6b22..351565858849b6539569c5fecc241e8f7c1fd609 100644 --- a/component/Git Tools/Batch Checkout Branch/index.sh +++ b/component/Git Tools/Batch Checkout Branch/index.sh @@ -6,39 +6,45 @@ # 作用:批量切换项目分支 # 使用:在需要批量切换项目分支的脚本中通过以下步骤使用该脚本 # 1、命令:. ./index.sh -# 2、配置环境变量:PROJECTS_TARGET_PATH +# 2、配置环境变量:PROJECT_TARGET_PATH #========================================================================================= -echo -e "\e[95m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量切换分支 ┃" -echo -e "┃ Batch Checkout Branch ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量切换分支 ┃" +echo -e "┃ Batch Checkout Branch ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Checkout Branch] 切换分支 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 -# PROJECTS_TARGET_PATH:克隆项目的目标路径 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` - - -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 不\n存在, 请先克隆项目!\e[0m" - exit 1 -fi - -echo -e "\n请输入切换的分支:" -read BRANCH -cd ${PROJECTS_TARGET_PATH} -PROJECTS=`ls` -for PROJECT in ${PROJECTS[@]}; do - cd ${PROJECT} - echo -e "\n\e[95;7m切换分支: ${PROJECT} [${BRANCH}]\e[0m" - git checkout ${BRANCH} +SCRIPT_PATH=$(pwd) + + +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" + +echo "" +read -r -p "请输入切换的分支: " BRANCH +strIsBlank "${BRANCH}" "请输入切换的分支, 切换分支失败!" + +function foreachGitProjects_run() { + echo -e "\n\e[34;7m切换分支: ${1} [${BRANCH}]\e[0m" + git checkout "${BRANCH}" + checkFail "未找到分支 [${BRANCH}], 请检查后操作!" git branch -vv - cd .. -done +} +foreachGitProjects cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Clone Project/config/projects.txt b/component/Git Tools/Batch Clone Project/config/projects.txt index d2dd2430c0994d43a59a205f78b2c91a0b159ad3..fec1fe3115885009f45cd0c15d585225f64ee702 100644 --- a/component/Git Tools/Batch Clone Project/config/projects.txt +++ b/component/Git Tools/Batch Clone Project/config/projects.txt @@ -1,2 +1,2 @@ -/mps/hc-mps-credit -/biz/hc-biz-product \ No newline at end of file +/biz/hc-biz-product +/mps/hc-mps-credit \ No newline at end of file diff --git a/component/Git Tools/Batch Clone Project/index.sh b/component/Git Tools/Batch Clone Project/index.sh index 63114f357f7db4a118d91e2dc9b26f3a07f309f0..2863184d6f793df43b1b8b348865bea5212922b5 100644 --- a/component/Git Tools/Batch Clone Project/index.sh +++ b/component/Git Tools/Batch Clone Project/index.sh @@ -6,62 +6,72 @@ # 作用:批量 clone 配置的项目 # 使用:在需要批量 clone 项目的脚本中通过以下步骤使用该脚本 # 1、命令:. ./index.sh -# 2、配置环境变量:PROJECTS_TARGET_PATH +# 2、配置环境变量:PROJECT_TARGET_PATH #========================================================================================= -echo -e "\e[93m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量克隆项目 ┃" -echo -e "┃ Batch Clone Project ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量克隆项目 ┃" +echo -e "┃ Batch Clone Project ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、配置待克隆项目列表到 [./config/projects.txt] ┃" +echo -e "┃ 2、执行 [Batch Clone Project] 克隆项目 ┃" +echo -e "┃ ┃" +echo -e "┃ 注意事项: ┃" +echo -e "┃ 1、配置项目列表格式为: /sub_group/project ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 -# PROJECTS_TARGET_PATH:克隆项目的目标路径 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" # 保存配置待克隆项目的列表文件路径 PROJECTS_CONFIG_PATH="./config/projects.txt" # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` +SCRIPT_PATH=$(pwd) + # 判断是否配置了待克隆文件及项目列表 -if [[ ! -e ${PROJECTS_CONFIG_PATH} ]]; then - echo -e "\n未创建 [${PROJECTS_CONFIG_PATH}] 文件, \n克隆失败!\e[0m" - exit 1 -else - if [[ -z `cat ${PROJECTS_CONFIG_PATH}` ]]; then - echo -e "\n未配置 [${PROJECTS_CONFIG_PATH}] 文件, \n文件用于配置待克隆的项目列表, 例如: \n/mps/scf-mps-account\n/biz/scf-biz-credit\e[0m" - exit 1 - fi -fi +fileIsNotExist "${PROJECTS_CONFIG_PATH}" "未创建 [${PROJECTS_CONFIG_PATH}] 文件, 批量克隆项目失败!" +strIsBlank "$(cat ${PROJECTS_CONFIG_PATH})" "未配置 [${PROJECTS_CONFIG_PATH}] 文件, 文件用于配置待克隆的项\n目列表, 例如: \n/mps/scf-mps-account\n/biz/scf-biz-credit" + +# 将配置文件行分隔符转换为 LF +dos2unix "${PROJECTS_CONFIG_PATH}" &> /dev/null # 判断是否已经存在克隆项目的目标目录 -if [[ -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 已\n经存在,是否删除(y/n): " - read IS_DELETE - if [[ ${IS_DELETE} != "y" ]]; then - echo -e "\n其他操作基于旧项目进行!\e[0m" +if [[ -d "${PROJECT_TARGET_PATH}" ]]; then + echo "" + read -r -p "项目目录 [${PROJECT_TARGET_PATH}] 已经存在, 是否删除(y/n): " IS_DELETE + if [[ "${IS_DELETE^^}" != "Y" ]]; then + echo -e "\n其他操作基于旧项目进行!\n\e[0m" exit 1 fi - rm -rf ${PROJECTS_TARGET_PATH} + rm -rf "${PROJECT_TARGET_PATH}" fi -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n创建目录:${PROJECTS_TARGET_PATH}" - mkdir -p ${PROJECTS_TARGET_PATH} +if [[ ! -d "${PROJECT_TARGET_PATH}" ]]; then + echo -e "\n创建目录:${PROJECT_TARGET_PATH}" + mkdir -p "${PROJECT_TARGET_PATH}" fi # 克隆项目 -echo -e "\n请输入 Git 组 URL:" -read GIT_GROUP_URL +echo "" +read -r -p "请输入 Git 组 URL: " GIT_GROUP_URL +strIsBlank "${GIT_GROUP_URL}" "请输入 Git 组 URL, 克隆项目失败!" -PROJECTS=`cat ${PROJECTS_CONFIG_PATH}` -cd ${PROJECTS_TARGET_PATH} -for PROJECT in ${PROJECTS[@]}; do - echo -e "\n\e[93;7m克隆项目: ${PROJECT}\e[0m" - CLONE_URL="${GIT_GROUP_URL}${PROJECT}.git" - git clone ${CLONE_URL} -done +while read -r PROJECT || [[ -n "${PROJECT}" ]]; do + if [[ -z "${PROJECT}" ]]; then + continue + fi + echo -e "\n\e[34;7m克隆项目: ${PROJECT}\e[0m" + git clone "${GIT_GROUP_URL}${PROJECT}.git" "${PROJECT_TARGET_PATH}/${PROJECT}" + checkFail "克隆项目失败, 请检查后操作!" +done < "${PROJECTS_CONFIG_PATH}" cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Creating Branch/index.sh b/component/Git Tools/Batch Creating Branch/index.sh index e60a29d3a512bab4ac857ba3fb65ec056f63cc38..626a140fc03db775aa7526a9c79ffa88d4281740 100644 --- a/component/Git Tools/Batch Creating Branch/index.sh +++ b/component/Git Tools/Batch Creating Branch/index.sh @@ -6,41 +6,57 @@ # 作用:批量创建分支 # 使用:在需要批量创建分支项目的脚本中通过以下步骤使用该脚本 # 1、命令:. ./index.sh -# 2、配置环境变量:PROJECTS_TARGET_PATH +# 2、配置环境变量:PROJECT_TARGET_PATH #========================================================================================= echo -e "\e[34m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量创建分支 ┃" -echo -e "┃ Batch Creating Branch ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量创建分支 ┃" +echo -e "┃ Batch Creating Branch ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Creating Branch] 创建分支 ┃" +echo -e "┃ 3、执行 [Batch Push Repository] 推送到仓库 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 -# PROJECTS_TARGET_PATH:克隆项目的目标路径 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` +SCRIPT_PATH=$(pwd) + +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 不\n存在, 请先克隆项目!\e[0m" - exit 1 +echo "" +read -r -p "请输入目标分支: " BRANCH +strIsBlank "${BRANCH}" "请输入目标分支, 创建分支失败!" + +echo "" +read -r -p "请输入源远程 (默认为 origin): " REMOTE_NAME +if [[ -z "${REMOTE_NAME}" ]]; then + REMOTE_NAME="origin" fi -echo -e "\n请输入创建的分支:" -read BRANCH -echo -e "\n请输入参照的分支:" -read SOURCE_BRANCH -cd ${PROJECTS_TARGET_PATH} -PROJECTS=`ls` -for PROJECT in ${PROJECTS[@]}; do - cd ${PROJECT} - echo -e "\n\e[34;7m创建分支: ${PROJECT} [${BRANCH}]\e[0m" - git checkout -b ${BRANCH} origin/${SOURCE_BRANCH} +echo "" +read -r -p "请输入源分支: " SOURCE_BRANCH +strIsBlank "${SOURCE_BRANCH}" "请输入源分支, 创建分支失败!" + +function foreachGitProjects_run() { + echo -e "\n\e[34;7m创建分支: ${1} [${BRANCH}]\e[0m" + git fetch "${REMOTE_NAME}" + git checkout -b "${BRANCH}" "${REMOTE_NAME}/${SOURCE_BRANCH}" + checkFail "创建分支失败, 请检查后操作!" git branch -vv - cd .. -done +} +foreachGitProjects cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Delete Remote Branch/index.sh b/component/Git Tools/Batch Delete Remote Branch/index.sh index cdac5663d54b0d478c8d396068ca4562db2c5ca4..714790ad21fc2f28a730379c9a02d4a368110c29 100644 --- a/component/Git Tools/Batch Delete Remote Branch/index.sh +++ b/component/Git Tools/Batch Delete Remote Branch/index.sh @@ -6,83 +6,80 @@ # 作用:批量删除远程分支 # 使用:在需要批量删除远程分支项目的脚本中通过以下步骤使用该脚本 # 1、命令:. ./index.sh -# 2、配置环境变量:PROJECTS_TARGET_PATH +# 2、配置环境变量:PROJECT_TARGET_PATH #========================================================================================= -echo -e "\e[95m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量删除远程分支 ┃" -echo -e "┃ Batch Delete Remote Branch ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量删除远程分支 ┃" +echo -e "┃ Batch Delete Remote Branch ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、配置需要保留的分支列表到: ┃" +echo -e "┃ [./config/retain-branches.txt] ┃" +echo -e "┃ 3、执行 [Batch Checkout Branch] 切换到待保留的任意分支 ┃" +echo -e "┃ 3、执行 [Batch Delete Remote Branch] 删除远程分支 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 -# PROJECTS_TARGET_PATH:克隆项目的目标路径 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` +SCRIPT_PATH=$(pwd) # 配置需要保留的分支列表 RETAIN_BRANCH_LIST_CONFIG="./config/retain-branches.txt" -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 不\n存在, 请先克隆项目!\e[0m" - exit 1 -fi +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" # 判断是否配置了需要保留的分支列表 -if [[ ! -e ${RETAIN_BRANCH_LIST_CONFIG} ]]; then - echo -e "\n未创建 [${RETAIN_BRANCH_LIST_CONFIG}] \n文件, 无法删除分支!\e[0m" - exit 1 -else - if [[ -z `cat ${RETAIN_BRANCH_LIST_CONFIG}` ]]; then - echo -e "\n未配置需要保留的分支, 否只保留 master \n分支(y/n):" - read IS_ONLY_MASTER - if [[ ${IS_DELETE} != "y" ]]; then - exit 1 - fi - fi -fi +fileIsNotExist "${RETAIN_BRANCH_LIST_CONFIG}" "未创建 [${RETAIN_BRANCH_LIST_CONFIG}] 文件, 无法删除分支!" +strIsBlank "$(cat ${RETAIN_BRANCH_LIST_CONFIG})" "请配置待保留的分支列表后执行!" -echo -e "\n是否批量删除远程分支(y/n):" -read IS_DELETE -if [[ ${IS_DELETE} != "y" ]]; then - echo -e "\n退出批量删除远程分支!\e[0m" - exit 1 -fi +# 将配置文件行分隔符转换为 LF +dos2unix "${RETAIN_BRANCH_LIST_CONFIG}" &> /dev/null + +selectYes "是否批量删除远程分支" "退出批量删除远程分支!" -RETAIN_BRANCHES=`cat ${RETAIN_BRANCH_LIST_CONFIG}` -cd ${PROJECTS_TARGET_PATH} -for PROJECT in `ls`; do - cd ${PROJECT} - echo "" - git checkout master +mapfile -t RETAIN_BRANCHES < "${RETAIN_BRANCH_LIST_CONFIG}" +HAS_REMOVE=0 +function foreachGitProjects_run() { + git fetch origin &> /dev/null - REMOTE_BRANCHES=`git branch -rl "origin/*" | sed 's/origin\///g'` - for REMOTE_BRANCH in ${REMOTE_BRANCHES[@]}; do - if [[ ${REMOTE_BRANCH} == "HEAD" || ${REMOTE_BRANCH} == "->" || ${REMOTE_BRANCH} == "master" ]]; then + REMOTE_BRANCHES=($(git branch -rl "origin/*" | sed 's/origin\///g' | sed 's/HEAD -> //g' | sort | uniq)) + for REMOTE_BRANCH in "${REMOTE_BRANCHES[@]}"; do + if [[ "${REMOTE_BRANCH}" = "master" ]]; then continue fi IS_REMOVE=1 - for RETAIN_BRANCH in ${RETAIN_BRANCHES[@]}; do - if [[ ${REMOTE_BRANCH} == ${RETAIN_BRANCH} ]]; then + for RETAIN_BRANCH in "${RETAIN_BRANCHES[@]}"; do + if [[ -n "${RETAIN_BRANCH}" && "${REMOTE_BRANCH}" = "${RETAIN_BRANCH}" ]]; then IS_REMOVE=0 break fi done - if [[ ${IS_REMOVE} == 1 ]]; then - echo -e "\n\e[95;7m删除分支: ${PROJECT} [${REMOTE_BRANCH}]\e[0m" - git push -d origin ${REMOTE_BRANCH} + if [[ ${IS_REMOVE} -eq 1 ]]; then + HAS_REMOVE=1 + echo -e "\n\e[34;7m删除分支: ${1} [${REMOTE_BRANCH}]\e[0m" + git push -d origin "${REMOTE_BRANCH}" + checkFail "删除远程分支失败, 请检查后操作!" fi done - - echo -e "\n\e[95;7m最新远程分支列表: ${PROJECT}\e[0m" - git branch -r +} +foreachGitProjects - cd .. -done +if [[ ${HAS_REMOVE} -eq 0 ]]; then + echo -e "\n\e[34m没有需要删除的分支!\e[0m" +fi cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Push Repository/index.sh b/component/Git Tools/Batch Push Repository/index.sh index 14d9051286cfac53fc65c4eabd4c91a79b1a9681..e9c33bf1e10c7e2402a021e81f2c7c6978f52414 100644 --- a/component/Git Tools/Batch Push Repository/index.sh +++ b/component/Git Tools/Batch Push Repository/index.sh @@ -6,44 +6,44 @@ # 作用:批量 push 到远程仓库 # 使用:在需要批量 push 到远程仓库项目的脚本中通过以下步骤使用该脚本 # 1、命令:. ./index.sh -# 2、配置环境变量:PROJECTS_TARGET_PATH +# 2、配置环境变量:PROJECT_TARGET_PATH #========================================================================================= -echo -e "\e[94m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量推送到仓库 ┃" -echo -e "┃ Batch Push Repository ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量推送到仓库 ┃" +echo -e "┃ Batch Push Repository ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Push Repository] 推送到仓库 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 -# PROJECTS_TARGET_PATH:克隆项目的目标路径 +# PROJECT_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` - - -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 不\n存在, 请先克隆项目!\e[0m" - exit 1 -fi - -echo -e "\n是否批量推送到仓库(y/n):" -read IS_DELETE -if [[ ${IS_DELETE} != "y" ]]; then - echo -e "\n退出批量推送到仓库!\e[0m" - exit 1 -fi - -cd ${PROJECTS_TARGET_PATH} -for PROJECT in `ls`; do - cd ${PROJECT} - CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD` - echo -e "\n\e[94;7m推送项目: ${PROJECT} [${CURRENT_BRANCH}]\e[0m" +SCRIPT_PATH=$(pwd) + + +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" + +selectYes "是否批量推送到仓库" "退出批量推送到仓库!" + +function foreachGitProjects_run() { + CURRENT_BRANCH=`git branch --show-current` + echo -e "\n\e[34;7m创建分支: ${1} [${CURRENT_BRANCH}]\e[0m" git push origin ${CURRENT_BRANCH} - cd .. -done + checkFail "推送到仓库失败, 请检查后操作!" +} +foreachGitProjects cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/component/Git Tools/Batch Synch Branch/index.sh b/component/Git Tools/Batch Synch Branch/index.sh new file mode 100644 index 0000000000000000000000000000000000000000..a5d9b8c10de315e6becda8f86e3a6a167f354d87 --- /dev/null +++ b/component/Git Tools/Batch Synch Branch/index.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +#========================================================================================= +# 作者:赵海春 +# 日期:2022.04.26 +# 作用:批量Fork项目或同步分支 +# 使用:在需要批量同步分支的脚本中通过以下步骤使用该脚本 +# 1、命令:. ./index.sh +# 2、配置环境变量:PROJECTS_TARGET_PATH +#========================================================================================= + +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量同步分支 ┃" +echo -e "┃ Batch Synch Branch ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Add Remote] 添加目标仓库远程信息 ┃" +echo -e "┃ 3、执行 [Batch Fork Project] 同源项目分支到目标仓库 ┃" +echo -e "┃ ┃" +echo -e "┃ 注意事项: ┃" +echo -e "┃ 1、若作为 fork 使用时, 必须先创建完成组和子组, 并且和源 ┃" +echo -e "┃ 组和子组名称一致 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" + +# 以下变量读取的环境变量 +# PROJECTS_TARGET_PATH:克隆项目的目标路径 + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" + +# 当前脚本所在目录路径 +SCRIPT_PATH=$(pwd) + + +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" + +selectYes "是否执行完成步骤 1、2 " "请先执行步骤 1、2!" + +echo "" +read -r -p "请输入需要同步的分支: " BRANCH_NAME +strIsBlank "${BRANCH_NAME}" "请输入需要同步的分支, 同步分支失败!" + +function foreachGitProjects_run() { + echo -e "\n\e[34;7m同步分支: ${1} [${BRANCH_NAME}]\e[0m" + REMOTES=($(git remote)) + if [[ ${#REMOTES[@]} -ne 2 ]]; then + echo -e "\n请先执行步骤 2, 添加远程!\e[0m" + continue + fi + + git checkout -b "${BRANCH_NAME}" "origin/${BRANCH_NAME}" + if [[ $? -ne 0 ]]; then + git checkout "${BRANCH_NAME}" + fi + + checkFail "切换 [origin/${BRANCH_NAME}] 分支异常, 请检查后操作!" + git push -u upstream "${BRANCH_NAME}" + checkFail "同步分支异常, 请检查后操作!" +} +foreachGitProjects + +cd "${SCRIPT_PATH}" +echo "" \ No newline at end of file diff --git a/component/Project Tools/Batch Modify Maven Version/awk/update_version.awk b/component/Project Tools/Batch Modify Maven Version/awk/update_version.awk index 58f448e542f27de41556affe5d8bead6d672bc75..8be3cbfbc8111a73ad0426f9ad9bedbcee0fdc70 100644 --- a/component/Project Tools/Batch Modify Maven Version/awk/update_version.awk +++ b/component/Project Tools/Batch Modify Maven Version/awk/update_version.awk @@ -12,10 +12,14 @@ BEGIN { } { - if ( $0 ~ ".*<\/version>" && matchedNum != 0 && matchedNum == ++matchingNum ) { - gsub(".*<\/version>", ""version"<\/version>", $0); + if ( $0 ~ ".*" && matchedNum != 0 && matchedNum == ++matchingNum ) { + gsub(".*", ""version"", $0); + + # 作用将 LF 转换为 CRLF + sub(/$/,"\r") print > FILENAME; } else { + sub(/$/,"\r") print > FILENAME; } } \ No newline at end of file diff --git a/component/Project Tools/Batch Modify Maven Version/index.sh b/component/Project Tools/Batch Modify Maven Version/index.sh index 91c1c5b6547e78df5665c309c491a36d4064678a..ea99b9852720c1af17345c965dc4db6a1e874ac1 100644 --- a/component/Project Tools/Batch Modify Maven Version/index.sh +++ b/component/Project Tools/Batch Modify Maven Version/index.sh @@ -9,46 +9,61 @@ # 2、配置环境变量:PROJECTS_TARGET_PATH #========================================================================================= -echo -e "\e[96m" -echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" -echo -e "┃ 批量修改Maven版本 ┃" -echo -e "┃ Batch Modify Maven Version ┃" -echo -e "┃ ┃" -echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" +echo -e "\e[34m" +echo -e "┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓" +echo -e "┃ 批量修改Maven版本 ┃" +echo -e "┃ Batch Modify Maven Version ┃" +echo -e "┃ ─────────────────────────────────────────────────────── ┃" +echo -e "┃ ┃" +echo -e "┃ 使用方法: ┃" +echo -e "┃ 1、执行 [Batch Clone Project] 克隆源项目 ┃" +echo -e "┃ 2、执行 [Batch Modify Maven Version] 修改Maven版本 ┃" +echo -e "┃ 3、执行 [Batch Push Repository] 推送到仓库 ┃" +echo -e "┃ ┃" +echo -e "┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Author:赵海春 ━━━━┛" # 以下变量读取的环境变量 # PROJECTS_TARGET_PATH:克隆项目的目标路径 +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" +. "${FUNCTION_ROOT_PATH}/git.sh" + # 当前脚本所在目录路径 -SCRIPT_PATH=`pwd` +SCRIPT_PATH=$(pwd) -if [[ ! -e ${PROJECTS_TARGET_PATH} ]]; then - echo -e "\n项目目录 [${PROJECTS_TARGET_PATH}] 不\n存在, 请先克隆项目!\e[0m" - exit 1 -fi +dirIsNotExist "${PROJECT_TARGET_PATH}" "请执行 [Batch Clone Project] 克隆源项目!" -echo -e "\n请选择版本类型(1-空壳版本 2-标品版本):" -read VERSION_TYPE_CODE -if [[ ${VERSION_TYPE_CODE} = 1 ]]; then +echo "" +read -r -p "请选择版本类型(1-空壳版本 2-标品版本): " VERSION_TYPE_CODE +case ${VERSION_TYPE_CODE} in +1) VERSION_TYPE="空壳版本" -elif [[ ${VERSION_TYPE_CODE} = 2 ]]; then + ;; +2) VERSION_TYPE="标品版本" -else - echo -e "\n请输入 1 或 2!\e[0m" + ;; +*) + echo -e "\e[91m\n请输入 1 或 2!\n\e[0m" exit 1 -fi - -echo -e "\n请输入版本号:" -read VERSION_VALUE -cd ${PROJECTS_TARGET_PATH} -for PROJECT in `ls`; do - cd ${PROJECT} - echo -e "\n\e[96;7m修改版本: ${PROJECT} [${VERSION_TYPE} - ${VERSION_VALUE}]\e[0m" - ${SCRIPT_PATH}/awk/update_version.awk -v matchedNum=${VERSION_TYPE_CODE} -v version=${VERSION_VALUE} ./pom.xml + ;; +esac + +echo "" +read -r -p "请输入版本号: " VERSION_VALUE +strIsBlank "${VERSION_VALUE}" "请输入版本号, 修改Maven版本失败!" + +function foreachGitProjects_run() { + pwd + echo "${SCRIPT_PATH}" + + echo -e "\n\e[34;7m修改版本: ${PROJECT} [${VERSION_TYPE} - ${VERSION_VALUE}]\e[0m" + "${SCRIPT_PATH}/awk/update_version.awk" -v matchedNum=${VERSION_TYPE_CODE} -v version="${VERSION_VALUE}" "./pom.xml" + checkFail "修改Maven版本异常, 请检查后操作!" git commit -am "修改${VERSION_TYPE}为: ${VERSION_VALUE}" - cd .. -done +} +foreachGitProjects cd "${SCRIPT_PATH}" -echo -e "\n\n" \ No newline at end of file +echo "" \ No newline at end of file diff --git a/function/check.sh b/function/check.sh new file mode 100644 index 0000000000000000000000000000000000000000..7604d925b3dfb3b3c7c1c612e851524a5d9001b8 --- /dev/null +++ b/function/check.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +#========================================================================================= +# 作者: 赵海春 +# 日期: 2022.04.30 +# 作用: 配置公共校验相关函数 +# 使用: 在需要公共函数时, 通过 FUNCTION_ROOT_PATH 环境变量引入需要的函数 +#========================================================================================= + +# 作用: 校验上一步执行是否异常退出, 若异常退出提示自定义信息后, 结束脚本 +# 参数: $1 异常退出提示消息 +function checkFail() { + if [[ $? -ne 0 ]]; then + echo -e "\e[91m\n${1}\n\e[0m" + exit 1 + fi +} + + +# ============================== 字符串相关工具类 ============================== + +# 作用: 校验字符串是否为空, 若为空退出, 并提示自定义信息 +# 参数: $1 待校验字符串 +# $2 异常退出提示消息 +function strIsBlank() { + if [[ -z "$1" ]]; then + echo -e "\e[91m\n${2}\n\e[0m" + exit 1 + fi +} + +# ============================== 字符串相关工具类 ============================== + + +# =============================== 目录相关工具类 =============================== + +# 作用: 校验目录是否存在, 若目录不存在退出, 并提示自定义信息 +# 参数: $1 待校验目录 +# $2 异常退出提示消息 +function dirIsNotExist() { + if [[ ! -d "$1" ]]; then + echo -e "\e[91m\n${2}\n\e[0m" + exit 1 + fi +} + +# =============================== 目录相关工具类 =============================== + + +# =============================== 文件相关工具类 =============================== + +# 作用: 校验文件是否存在, 若文件不存在退出, 并提示自定义信息 +# 参数: $1 待校验文件 +# $2 异常退出提示消息 +function fileIsNotExist() { + if [[ ! -f "$1" ]]; then + echo -e "\e[91m\n${2}\n\e[0m" + exit 1 + fi +} + +# =============================== 文件相关工具类 =============================== + + +# =============================== 选择相关工具类 =============================== + +# 作用: 校验是否选择了 y/Y, 若选择不是 y/Y, 并提示自定义信息 +# 参数: $1 用户输入提示信息 +# $2 选择不是 y/Y 提示信息 +function selectYes() { + echo "" + read -r -p "$1(y/n): " SELECT + if [[ "${SELECT^^}" != "Y" ]]; then + echo -e "\n$2\n\e[0m" + exit 1 + fi +} + +# =============================== 选择相关工具类 =============================== + diff --git a/function/git.sh b/function/git.sh new file mode 100644 index 0000000000000000000000000000000000000000..a4063f43645c6947998a8ca46ee0e39caa9e8d60 --- /dev/null +++ b/function/git.sh @@ -0,0 +1,38 @@ +#!/bin/bash + +#========================================================================================= +# 作者: 赵海春 +# 日期: 2022.05.02 +# 作用: 配置 git 相关相关函数 +# 使用: 在需要公共函数时, 通过 FUNCTION_ROOT_PATH 环境变量引入需要的函数 +#========================================================================================= + +# 引入公共函数 +. "${FUNCTION_ROOT_PATH}/check.sh" + + +# 作用: 循环遍历 git 项目, 进入到 git 项目目录调用 foreachGitProjects_run 函数 (需要用户自定) +# 参数: $1 待进入的项目目录, 不需要用户传值, 遍历的根目录为 PROJECT_TARGET_PATH +function foreachGitProjects() { + if [[ -z "$1" ]]; then + cd "${PROJECT_TARGET_PATH}" + fi + + # 判断若当前目录中存在 .git 目录表示为 git 项目 + if [[ -d "./.git" ]]; then + # 调用 foreachGitProjects_run 函数, 参数一为 PROJECT_TARGET_PATH 的子目录 + foreachGitProjects_run "${1}" + checkFail "未定义函数: foreachGitProjects_run" + return + fi + + # 若没有,则只是普通目录,进入目录,递归遍历子目录 + DIRS=($(ls)) + for DIR in "${DIRS[@]}"; do + if [[ -d "${DIR}" ]]; then + cd "${DIR}" + foreachGitProjects "${1}/${DIR}" + cd .. + fi + done +} diff --git a/image/0001.png b/image/0001.png index 0473207539f7c065c7e9e532510a6c324c9da24a..055014398daac754be2b795dc8acc311e73bd242 100644 Binary files a/image/0001.png and b/image/0001.png differ diff --git a/image/0002.png b/image/0002.png index 5d5c578518529a3bfd56176b5ed99a07cf696947..9d794502484cb7b56f4c6fd85ac2c4e9e8cef4df 100644 Binary files a/image/0002.png and b/image/0002.png differ diff --git a/image/0003.png b/image/0003.png index 7b11f2663ac9b47c6fd56f192270a1b00634427a..4905b2bfca8648178513094d52ecc8999f9ff277 100644 Binary files a/image/0003.png and b/image/0003.png differ diff --git a/image/0004.png b/image/0004.png index 5804fc835120dd9cdb9cc3083d94230e3fd537b8..a22d5e3c33e3ef4a862afd4e4ad6e3b2a71313a0 100644 Binary files a/image/0004.png and b/image/0004.png differ diff --git a/image/0005.png b/image/0005.png index dfd6021ec36f50a24e97f40a5960e788aaeca3cf..994860ebbcaf9b2c6ae31db4249e405d2761044a 100644 Binary files a/image/0005.png and b/image/0005.png differ diff --git a/image/0006.png b/image/0006.png index 22126b370039f4c558e179861d72368e4e33f11d..4dc095071fc6f6f660fa7dd2439c8bcabef7682f 100644 Binary files a/image/0006.png and b/image/0006.png differ diff --git a/image/0007.png b/image/0007.png index ac344ed08216fb263a7d9692ce73bb2e12d1b364..089d114dabec77fc5c95d949aa89b49d7b508b7e 100644 Binary files a/image/0007.png and b/image/0007.png differ diff --git a/image/0008.png b/image/0008.png index 214939cb02643bbc62879923ea778da2886b1f55..1492e2571df96f830ac1e8b46898ca64540dbab5 100644 Binary files a/image/0008.png and b/image/0008.png differ diff --git a/image/0009.png b/image/0009.png index 270a43c655c7f87a9059b2c159cc2af772847048..5e724c6562cd2942124f503229dafaa6ea63d02e 100644 Binary files a/image/0009.png and b/image/0009.png differ diff --git a/image/0012.png b/image/0012.png new file mode 100644 index 0000000000000000000000000000000000000000..17fdbba10c846e8320906ac5230a7b7c6530267a Binary files /dev/null and b/image/0012.png differ diff --git a/image/0013.png b/image/0013.png new file mode 100644 index 0000000000000000000000000000000000000000..a49b46e82ddf76417226365c78a21a6c6991c714 Binary files /dev/null and b/image/0013.png differ diff --git a/index.sh b/index.sh index d58d76a7b933ea66c56f17e029ae9c508968d002..b3caae16b19b0ba546dc049bbbb545552d12fedf 100644 --- a/index.sh +++ b/index.sh @@ -1,79 +1,99 @@ #!/bin/bash -# 全局环境变量 -ROOT_PATH=`pwd` -PROJECTS_TARGET_PATH="${ROOT_PATH}/project" -COMPONENT_PATH="${ROOT_PATH}/component" +#===================== 全局环境变量 ===================== +# 项目根目录 +export ROOT_PATH=`pwd` +# 克隆项目的路径 +export PROJECT_TARGET_PATH="${ROOT_PATH}/project" +# 组件根目录 +export COMPONENT_ROOT_PATH="${ROOT_PATH}/component" +# 函数根目录 +export FUNCTION_ROOT_PATH="${ROOT_PATH}/function" +#===================== 全局环境变量 ===================== + + +# 当前组件目录级别 CURRENT_DIR_LEVEL=1 clear -cd ${COMPONENT_PATH} -while [ true ]; do + +cd "${COMPONENT_ROOT_PATH}" +while true; do echo -e "\e[92m" - echo -e "╔════════════════════════════════════════════════════════╗" - echo -e "║ 自动化工具 V2.0.0 ║" - echo -e "╟────────────────────────────────────────────────────────╢" - echo -e "║ ║" + echo -e "╔═════════════════════════════════════════════════════════╗" + echo -e "║ 自动化工具 V3.0.0 ║" + echo -e "╟─────────────────────────────────────────────────────────╢" + echo -e "║ ║" - INDEX=0 + # 修改分隔符为换行符 OLD_IFS="$IFS" IFS=$'\n' + + INDEX=0 COMPONENTS=(`ls`) - for COMPONENT in ${COMPONENTS[@]}; do - printf "║\t%-50.42s║\n" "${INDEX}、${COMPONENT}" - INDEX=$[${INDEX} + 1] + for COMPONENT in "${COMPONENTS[@]}"; do + printf "║\t%-50.42s║\n" "[${INDEX}] ${COMPONENT}" + let INDEX++ done + IFS=${OLD_IFS} - echo -e "║ ║" + echo -e "║ ║" + # 若当前级别为 2 出现返回上一级的菜单 if [[ ${CURRENT_DIR_LEVEL} -eq 2 ]]; then - printf "║\t%-50.42s║\n" "R、Returns Upper Directory" + printf "║\t%-50.42s║\n" "[R] Returns Upper Directory" fi - printf "║\t%-50.42s║\n" "E、Exit" - - echo -e "║ ║" - echo -e "╚════════════════════════════════════════════════════════╝" - echo -e "\n请选择操作(输入菜单编号):" - read OPERATOR + printf "║\t%-50.42s║\n" "[E] Exit" + echo -e "║ ║" + echo -e "╚═════════════════════════════════════════════════════════╝" + echo "" + read -r -p "请选择操作(输入菜单编号): " OPERATOR - if [[ ${OPERATOR} == 'e' || ${OPERATOR} == 'E' ]]; then + # 若输入 e/E 退出系统 + if [[ ${OPERATOR^^} == 'E' ]]; then echo -e "\n退出系统成功!\e[0m" exit fi - if [[ ${CURRENT_DIR_LEVEL} -eq 2 && (${OPERATOR} == 'r' || ${OPERATOR} == 'R') ]]; then - CURRENT_DIR_LEVEL=$[${CURRENT_DIR_LEVEL} - 1] - cd ${COMPONENT_PATH} + # 若当前菜单等级为 2 且输入 r/R 返回上一级菜单 + if [[ ${CURRENT_DIR_LEVEL} -eq 2 && ${OPERATOR^^} == 'R' ]]; then + let CURRENT_DIR_LEVEL-- + cd "${COMPONENT_ROOT_PATH}" clear continue fi if [[ ${OPERATOR} -lt 0 || ${OPERATOR} -ge ${#COMPONENTS[@]} ]]; then - echo -e "\n只能输入 [0, ${#COMPONENTS[@]}) 范围内的值!\e[0m" + let INDEX-- + echo -e "\e[91m\n只能输入 [0 ~ ${INDEX}] 范围内的值!\n\e[0m" continue fi - if [[ ${CURRENT_DIR_LEVEL} -eq 1 ]]; then - CURRENT_DIR_LEVEL=$[${CURRENT_DIR_LEVEL} + 1] + case ${CURRENT_DIR_LEVEL} in + 1) + let CURRENT_DIR_LEVEL++ cd "./${COMPONENTS[${OPERATOR}]}" clear continue - fi - - if [[ ${CURRENT_DIR_LEVEL} -eq 2 ]]; then + ;; + 2) cd "./${COMPONENTS[${OPERATOR}]}" if [[ ! -e "./index.sh" ]]; then - echo -e "\n不存在 index.sh 脚本,执行异常\e[0m" + echo -e "\e[91m\n不存在 index.sh 脚本,执行异常!\n\e[0m" exit 1 fi clear - . ./index.sh + sh ./index.sh cd .. continue - fi + ;; + *) + echo -e "\e[91m\n暂时只支持 2 级菜单!\n\e[0m" + ;; + esac done