mirror of
				https://gitee.com/SuperManito/LinuxMirrors
				synced 2025-11-04 08:20:28 +08:00 
			
		
		
		
	全局引入高级交互式选择器封装并更新交互内容设计
This commit is contained in:
		
							
								
								
									
										348
									
								
								ChangeMirrors.sh
									
									
									
									
									
								
							
							
						
						
									
										348
									
								
								ChangeMirrors.sh
									
									
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
## Author: SuperManito
 | 
					## Author: SuperManito
 | 
				
			||||||
## Modified: 2024-12-05
 | 
					## Modified: 2024-12-06
 | 
				
			||||||
## License: MIT
 | 
					## License: MIT
 | 
				
			||||||
## GitHub: https://github.com/SuperManito/LinuxMirrors
 | 
					## GitHub: https://github.com/SuperManito/LinuxMirrors
 | 
				
			||||||
## Website: https://linuxmirrors.cn
 | 
					## Website: https://linuxmirrors.cn
 | 
				
			||||||
@@ -182,8 +182,8 @@ File_LinuxRelease=/etc/os-release
 | 
				
			|||||||
File_RedHatRelease=/etc/redhat-release
 | 
					File_RedHatRelease=/etc/redhat-release
 | 
				
			||||||
File_DebianVersion=/etc/debian_version
 | 
					File_DebianVersion=/etc/debian_version
 | 
				
			||||||
File_ArmbianRelease=/etc/armbian-release
 | 
					File_ArmbianRelease=/etc/armbian-release
 | 
				
			||||||
File_OpenCloudOSRelease=/etc/opencloudos-release
 | 
					 | 
				
			||||||
File_openEulerRelease=/etc/openEuler-release
 | 
					File_openEulerRelease=/etc/openEuler-release
 | 
				
			||||||
 | 
					File_OpenCloudOSRelease=/etc/opencloudos-release
 | 
				
			||||||
File_AnolisOSRelease=/etc/anolis-release
 | 
					File_AnolisOSRelease=/etc/anolis-release
 | 
				
			||||||
File_openKylinVersion=/etc/kylin-version/kylin-system-version.conf
 | 
					File_openKylinVersion=/etc/kylin-version/kylin-system-version.conf
 | 
				
			||||||
File_ArchLinuxRelease=/etc/arch-release
 | 
					File_ArchLinuxRelease=/etc/arch-release
 | 
				
			||||||
@@ -229,13 +229,13 @@ PURPLE='\033[35m'
 | 
				
			|||||||
AZURE='\033[36m'
 | 
					AZURE='\033[36m'
 | 
				
			||||||
PLAIN='\033[0m'
 | 
					PLAIN='\033[0m'
 | 
				
			||||||
BOLD='\033[1m'
 | 
					BOLD='\033[1m'
 | 
				
			||||||
SUCCESS="\033[1;32m✔${PLAIN}"
 | 
					SUCCESS=" \033[1;32m✔${PLAIN}"
 | 
				
			||||||
COMPLETE="\033[1;32m✔${PLAIN}"
 | 
					COMPLETE=" \033[1;32m✔${PLAIN}"
 | 
				
			||||||
WARN="\033[1;43m 警告 ${PLAIN}"
 | 
					WARN=" \033[1;43m 警告 ${PLAIN}"
 | 
				
			||||||
ERROR="\033[1;31m✘${PLAIN}"
 | 
					ERROR=" \033[1;31m✘${PLAIN}"
 | 
				
			||||||
FAIL="\033[1;31m✘${PLAIN}"
 | 
					FAIL=" \033[1;31m✘${PLAIN}"
 | 
				
			||||||
TIP="\033[1;44m 提示 ${PLAIN}"
 | 
					TIP=" \033[1;44m 提示 ${PLAIN}"
 | 
				
			||||||
WORKING="\033[1;36m>_${PLAIN}"
 | 
					WORKING=" \033[1;36m>_${PLAIN}"
 | 
				
			||||||
# SUCCESS="[\033[1;32m成功${PLAIN}]"
 | 
					# SUCCESS="[\033[1;32m成功${PLAIN}]"
 | 
				
			||||||
# COMPLETE="[\033[1;32m完成${PLAIN}]"
 | 
					# COMPLETE="[\033[1;32m完成${PLAIN}]"
 | 
				
			||||||
# WARN="[\033[1;5;33m注意${PLAIN}]"
 | 
					# WARN="[\033[1;5;33m注意${PLAIN}]"
 | 
				
			||||||
@@ -634,7 +634,7 @@ function run_start() {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function run_end() {
 | 
					function run_end() {
 | 
				
			||||||
    echo -e "\n✨️ \033[1;34mPowered by https://linuxmirrors.cn\033[0m\n"
 | 
					    echo -e "\n ✨️ \033[1;34mPowered by https://linuxmirrors.cn\033[0m\n"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 报错退出
 | 
					## 报错退出
 | 
				
			||||||
@@ -666,10 +666,10 @@ function collect_system_info() {
 | 
				
			|||||||
        SYSTEM_FACTIONS="${SYSTEM_DEBIAN}"
 | 
					        SYSTEM_FACTIONS="${SYSTEM_DEBIAN}"
 | 
				
			||||||
    elif [ -s $File_RedHatRelease ]; then
 | 
					    elif [ -s $File_RedHatRelease ]; then
 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_REDHAT}"
 | 
					        SYSTEM_FACTIONS="${SYSTEM_REDHAT}"
 | 
				
			||||||
    elif [ -s $File_OpenCloudOSRelease ]; then
 | 
					 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_OPENCLOUDOS}" # 自 9.0 版本起不再基于红帽
 | 
					 | 
				
			||||||
    elif [ -s $File_openEulerRelease ]; then
 | 
					    elif [ -s $File_openEulerRelease ]; then
 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_OPENEULER}"
 | 
					        SYSTEM_FACTIONS="${SYSTEM_OPENEULER}"
 | 
				
			||||||
 | 
					    elif [ -s $File_OpenCloudOSRelease ]; then
 | 
				
			||||||
 | 
					        SYSTEM_FACTIONS="${SYSTEM_OPENCLOUDOS}" # 自 9.0 版本起不再基于红帽
 | 
				
			||||||
    elif [ -s $File_AnolisOSRelease ]; then
 | 
					    elif [ -s $File_AnolisOSRelease ]; then
 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_ANOLISOS}" # 自 8.8 版本起不再基于红帽
 | 
					        SYSTEM_FACTIONS="${SYSTEM_ANOLISOS}" # 自 8.8 版本起不再基于红帽
 | 
				
			||||||
    elif [ -s $File_openKylinVersion ]; then
 | 
					    elif [ -s $File_openKylinVersion ]; then
 | 
				
			||||||
@@ -747,13 +747,13 @@ function collect_system_info() {
 | 
				
			|||||||
            is_supported="false"
 | 
					            is_supported="false"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENCLOUDOS}")
 | 
					    "${SYSTEM_OPENEULER}")
 | 
				
			||||||
        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" != [8-9] && "${SYSTEM_VERSION_NUMBER_MAJOR}" != 23 ]] || [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" == 8 && "$SYSTEM_VERSION_NUMBER_MINOR" -lt 6 ]]; then
 | 
					        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" != 2[1-4] ]]; then
 | 
				
			||||||
            is_supported="false"
 | 
					            is_supported="false"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENEULER}")
 | 
					    "${SYSTEM_OPENCLOUDOS}")
 | 
				
			||||||
        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" != 2[1-4] ]]; then
 | 
					        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" != [8-9] && "${SYSTEM_VERSION_NUMBER_MAJOR}" != 23 ]] || [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" == 8 && "$SYSTEM_VERSION_NUMBER_MINOR" -lt 6 ]]; then
 | 
				
			||||||
            is_supported="false"
 | 
					            is_supported="false"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
@@ -884,7 +884,7 @@ function collect_system_info() {
 | 
				
			|||||||
    "${SYSTEM_DEBIAN}" | "${SYSTEM_ALPINE}" | "${SYSTEM_OPENKYLIN}")
 | 
					    "${SYSTEM_DEBIAN}" | "${SYSTEM_ALPINE}" | "${SYSTEM_OPENKYLIN}")
 | 
				
			||||||
        SYNC_MIRROR_TEXT="更新软件源"
 | 
					        SYNC_MIRROR_TEXT="更新软件源"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        SYNC_MIRROR_TEXT="生成软件源缓存"
 | 
					        SYNC_MIRROR_TEXT="生成软件源缓存"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENSUSE}")
 | 
					    "${SYSTEM_OPENSUSE}")
 | 
				
			||||||
@@ -894,6 +894,11 @@ function collect_system_info() {
 | 
				
			|||||||
        SYNC_MIRROR_TEXT="同步软件源"
 | 
					        SYNC_MIRROR_TEXT="同步软件源"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					    ## 判断是否可以使用高级交互式选择器
 | 
				
			||||||
 | 
					    CAN_USE_ADVANCED_INTERACTIVE_SELECTION="false"
 | 
				
			||||||
 | 
					    if [ ! -z "$(command -v tput)" ]; then
 | 
				
			||||||
 | 
					        CAN_USE_ADVANCED_INTERACTIVE_SELECTION="true"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 命令选项兼容性判断
 | 
					## 命令选项兼容性判断
 | 
				
			||||||
@@ -975,8 +980,8 @@ function choose_mirrors() {
 | 
				
			|||||||
            done
 | 
					            done
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            for ((i = 0; i < ${#list_arr[@]}; i++)); do
 | 
					            for ((i = 0; i < ${#list_arr[@]}; i++)); do
 | 
				
			||||||
                tmp_mirror_name=$(echo "${list_arr[i]}" | awk -F '@' '{print$1}') # 软件源名称
 | 
					                tmp_mirror_name="${list_arr[i]%@*}" # 软件源名称
 | 
				
			||||||
                tmp_mirror_url=$(echo "${list_arr[i]}" | awk -F '@' '{print$2}')  # 软件源地址
 | 
					                tmp_mirror_url="${list_arr[i]#*@}"  # 软件源地址
 | 
				
			||||||
                arr_num=$((i + 1))
 | 
					                arr_num=$((i + 1))
 | 
				
			||||||
                echo -e " ❖  $arr_num. ${tmp_mirror_url} | ${tmp_mirror_name}"
 | 
					                echo -e " ❖  $arr_num. ${tmp_mirror_url} | ${tmp_mirror_name}"
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
@@ -991,13 +996,21 @@ function choose_mirrors() {
 | 
				
			|||||||
        for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
 | 
					        for ((i = 0; i < ${#mirror_list_extranet[@]}; i++)); do
 | 
				
			||||||
            if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
 | 
					            if [[ "${SOURCE}" == "${mirror_list_extranet[i]}" ]]; then
 | 
				
			||||||
                intranet_source="${mirror_list_intranet[i]}"
 | 
					                intranet_source="${mirror_list_intranet[i]}"
 | 
				
			||||||
                ONLY_HTTP="True"
 | 
					                ONLY_HTTP="true" # 内网地址一般不支持 HTTPS 协议
 | 
				
			||||||
                break
 | 
					                break
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
        done
 | 
					        done
 | 
				
			||||||
        if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
 | 
					        if [[ -z "${USE_INTRANET_SOURCE}" ]]; then
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}默认使用软件源的公网地址,是否继续?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "false" ]]; then
 | 
				
			||||||
 | 
					                    SOURCE="${intranet_source}"
 | 
				
			||||||
 | 
					                    echo -e "\n$WARN 已切换至内网专用地址,仅限在特定环境下使用!"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                local CHOICE=$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}")
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 默认使用软件源的公网地址,是否继续? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1011,6 +1024,7 @@ function choose_mirrors() {
 | 
				
			|||||||
                    echo -e "\n$WARN 输入错误,默认不使用内网地址!"
 | 
					                    echo -e "\n$WARN 输入错误,默认不使用内网地址!"
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
        elif [[ "${USE_INTRANET_SOURCE}" == "true" ]]; then
 | 
					        elif [[ "${USE_INTRANET_SOURCE}" == "true" ]]; then
 | 
				
			||||||
            SOURCE="${intranet_source}"
 | 
					            SOURCE="${intranet_source}"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
@@ -1034,18 +1048,24 @@ function choose_mirrors() {
 | 
				
			|||||||
        if [[ "${USE_OFFICIAL_SOURCE}" == "true" ]]; then
 | 
					        if [[ "${USE_OFFICIAL_SOURCE}" == "true" ]]; then
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					        local mirror_list_name mirror_list_print_length
 | 
				
			||||||
        if [[ ${USE_ABROAD_SOURCE} = "true" ]]; then
 | 
					        if [[ "${USE_ABROAD_SOURCE}" = "true" ]]; then
 | 
				
			||||||
            local mirror_list_name="mirror_list_abroad"
 | 
					            mirror_list_name="mirror_list_abroad"
 | 
				
			||||||
            print_mirrors_list "${mirror_list_name}" 60
 | 
					            mirror_list_print_length=60
 | 
				
			||||||
        elif [[ ${USE_EDU_SOURCE} = "true" ]]; then
 | 
					        elif [[ "${USE_EDU_SOURCE}" = "true" ]]; then
 | 
				
			||||||
            local mirror_list_name="mirror_list_edu"
 | 
					            mirror_list_name="mirror_list_edu"
 | 
				
			||||||
            print_mirrors_list "${mirror_list_name}" 31
 | 
					            mirror_list_print_length=31
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            local mirror_list_name="mirror_list_default"
 | 
					            mirror_list_name="mirror_list_default"
 | 
				
			||||||
            print_mirrors_list "${mirror_list_name}" 31
 | 
					            mirror_list_print_length=31
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想使用的软件源:\${PLAIN}\\n\""
 | 
				
			||||||
 | 
					            SOURCE="${_SELECT_RESULT#*@}"
 | 
				
			||||||
 | 
					            echo -e "\n ${GREEN}➜${PLAIN}  ${BOLD}${_SELECT_RESULT%@*}${PLAIN}" | sed "s| · | |g"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            print_mirrors_list "${mirror_list_name}" $mirror_list_print_length
 | 
				
			||||||
            local CHOICE=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的软件源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
					            local CHOICE=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的软件源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
				
			||||||
            while true; do
 | 
					            while true; do
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
@@ -1057,8 +1077,6 @@ function choose_mirrors() {
 | 
				
			|||||||
                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
					                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        SOURCE="$(eval echo \${${mirror_list_name}[$((INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
					                        SOURCE="$(eval echo \${${mirror_list_name}[$((INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
				
			||||||
                    # echo "${SOURCE}"
 | 
					 | 
				
			||||||
                    # exit
 | 
					 | 
				
			||||||
                        break
 | 
					                        break
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
@@ -1068,6 +1086,7 @@ function choose_mirrors() {
 | 
				
			|||||||
                esac
 | 
					                esac
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## 选择软件源内网地址
 | 
					    ## 选择软件源内网地址
 | 
				
			||||||
    if [[ "${mirror_list_extranet[*]}" =~ (^|[^[:alpha:]])"${SOURCE}"([^[:alpha:]]|$) ]]; then
 | 
					    if [[ "${mirror_list_extranet[*]}" =~ (^|[^[:alpha:]])"${SOURCE}"([^[:alpha:]]|$) ]]; then
 | 
				
			||||||
@@ -1078,8 +1097,17 @@ function choose_mirrors() {
 | 
				
			|||||||
## 选择同步或更新软件源所使用的 WEB 协议( HTTP/HTTPS)
 | 
					## 选择同步或更新软件源所使用的 WEB 协议( HTTP/HTTPS)
 | 
				
			||||||
function choose_protocol() {
 | 
					function choose_protocol() {
 | 
				
			||||||
    if [[ -z "${WEB_PROTOCOL}" ]]; then
 | 
					    if [[ -z "${WEB_PROTOCOL}" ]]; then
 | 
				
			||||||
        if [[ "${ONLY_HTTP}" == "True" ]]; then
 | 
					        if [[ "${ONLY_HTTP}" == "true" ]]; then
 | 
				
			||||||
            WEB_PROTOCOL="http"
 | 
					            WEB_PROTOCOL="http"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}软件源是否使用 HTTP 协议?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    WEB_PROTOCOL="http"
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    WEB_PROTOCOL="https"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                local CHOICE=$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}")
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 软件源是否使用 HTTP 协议? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
@@ -1098,6 +1126,7 @@ function choose_protocol() {
 | 
				
			|||||||
                esac
 | 
					                esac
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    WEB_PROTOCOL="${WEB_PROTOCOL,,}"
 | 
					    WEB_PROTOCOL="${WEB_PROTOCOL,,}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -1132,6 +1161,19 @@ function choose_install_epel_packages() {
 | 
				
			|||||||
    esac
 | 
					    esac
 | 
				
			||||||
    ## 选择是否安装 EPEL 附加软件包
 | 
					    ## 选择是否安装 EPEL 附加软件包
 | 
				
			||||||
    if [[ -z "${INSTALL_EPEL}" ]]; then
 | 
					    if [[ -z "${INSTALL_EPEL}" ]]; then
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            echo ''
 | 
				
			||||||
 | 
					            if [ $VERIFICATION_EPEL -eq 0 ]; then
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源?${PLAIN}"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}是否安装 EPEL 附加软件包?${PLAIN}"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                INSTALL_EPEL="true"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                INSTALL_EPEL="false"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            if [ $VERIFICATION_EPEL -eq 0 ]; then
 | 
					            if [ $VERIFICATION_EPEL -eq 0 ]; then
 | 
				
			||||||
                local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}")
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 检测到系统已安装 EPEL 附加软件包,是否替换/覆盖软件源? [Y/n] ${PLAIN}")
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
@@ -1152,6 +1194,7 @@ function choose_install_epel_packages() {
 | 
				
			|||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            esac
 | 
					            esac
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 关闭防火墙和SELinux
 | 
					## 关闭防火墙和SELinux
 | 
				
			||||||
@@ -1161,6 +1204,13 @@ function close_firewall_service() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
    if [[ "$(systemctl is-active firewalld)" == "active" ]]; then
 | 
					    if [[ "$(systemctl is-active firewalld)" == "active" ]]; then
 | 
				
			||||||
        if [[ -z "${CLOSE_FIREWALL}" ]]; then
 | 
					        if [[ -z "${CLOSE_FIREWALL}" ]]; then
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}是否关闭防火墙和 SELinux ?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    CLOSE_FIREWALL="true"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}")
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1174,6 +1224,7 @@ function close_firewall_service() {
 | 
				
			|||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        if [[ "${CLOSE_FIREWALL}" == "true" ]]; then
 | 
					        if [[ "${CLOSE_FIREWALL}" == "true" ]]; then
 | 
				
			||||||
            local SelinuxConfig=/etc/selinux/config
 | 
					            local SelinuxConfig=/etc/selinux/config
 | 
				
			||||||
            systemctl disable --now firewalld >/dev/null 2>&1
 | 
					            systemctl disable --now firewalld >/dev/null 2>&1
 | 
				
			||||||
@@ -1199,6 +1250,15 @@ function backup_original_mirrors() {
 | 
				
			|||||||
            if [[ "${IGNORE_BACKUP_TIPS}" != "false" ]]; then
 | 
					            if [[ "${IGNORE_BACKUP_TIPS}" != "false" ]]; then
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}检测到系统中存在已备份的 ${type} 源文件,是否跳过覆盖备份?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "false" ]]; then
 | 
				
			||||||
 | 
					                    echo ''
 | 
				
			||||||
 | 
					                    cp -rvf "${target_file}" "${backup_file}" 2>&1
 | 
				
			||||||
 | 
					                    BACKED_UP="true"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 ${type} 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
					                local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 ${type} 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE_BACKUP}" INPUT
 | 
					                read -rp "${CHOICE_BACKUP}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1213,6 +1273,7 @@ function backup_original_mirrors() {
 | 
				
			|||||||
                    echo -e "\n$WARN 输入错误,默认不覆盖!"
 | 
					                    echo -e "\n$WARN 输入错误,默认不覆盖!"
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            echo ''
 | 
					            echo ''
 | 
				
			||||||
            cp -rvf "${target_file}" "${backup_file}" 2>&1
 | 
					            cp -rvf "${target_file}" "${backup_file}" 2>&1
 | 
				
			||||||
@@ -1237,6 +1298,15 @@ function backup_original_mirrors() {
 | 
				
			|||||||
            if [[ "${IGNORE_BACKUP_TIPS}" != "false" ]]; then
 | 
					            if [[ "${IGNORE_BACKUP_TIPS}" != "false" ]]; then
 | 
				
			||||||
                return
 | 
					                return
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "false" ]]; then
 | 
				
			||||||
 | 
					                    echo ''
 | 
				
			||||||
 | 
					                    cp -rvf $target_dir/* "${backup_dir}" 2>&1
 | 
				
			||||||
 | 
					                    BACKED_UP="true"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
					                local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到系统中存在已备份的 repo 源文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE_BACKUP}" INPUT
 | 
					                read -rp "${CHOICE_BACKUP}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1251,6 +1321,7 @@ function backup_original_mirrors() {
 | 
				
			|||||||
                    echo -e "\n$WARN 输入错误,默认不覆盖!"
 | 
					                    echo -e "\n$WARN 输入错误,默认不覆盖!"
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            echo ''
 | 
					            echo ''
 | 
				
			||||||
            cp -rvf $target_dir/* "${backup_dir}" 2>&1
 | 
					            cp -rvf $target_dir/* "${backup_dir}" 2>&1
 | 
				
			||||||
@@ -1290,7 +1361,7 @@ function backup_original_mirrors() {
 | 
				
			|||||||
                backup_file $File_LinuxMintSourceList $File_LinuxMintSourceListBackup "official-package-repositories.list"
 | 
					                backup_file $File_LinuxMintSourceList $File_LinuxMintSourceListBackup "official-package-repositories.list"
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
            # /etc/yum.repos.d
 | 
					            # /etc/yum.repos.d
 | 
				
			||||||
            backup_dir $Dir_YumRepos $Dir_YumReposBackup
 | 
					            backup_dir $Dir_YumRepos $Dir_YumReposBackup
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
@@ -1415,13 +1486,6 @@ function remove_original_mirrors() {
 | 
				
			|||||||
            esac
 | 
					            esac
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENCLOUDOS}")
 | 
					 | 
				
			||||||
        if [ ! -d $Dir_YumRepos ]; then
 | 
					 | 
				
			||||||
            mkdir -p $Dir_YumRepos
 | 
					 | 
				
			||||||
            return
 | 
					 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
        rm -rf $Dir_YumRepos/OpenCloudOS*
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    "${SYSTEM_OPENEULER}")
 | 
					    "${SYSTEM_OPENEULER}")
 | 
				
			||||||
        if [ ! -d $Dir_YumRepos ]; then
 | 
					        if [ ! -d $Dir_YumRepos ]; then
 | 
				
			||||||
            mkdir -p $Dir_YumRepos
 | 
					            mkdir -p $Dir_YumRepos
 | 
				
			||||||
@@ -1429,6 +1493,13 @@ function remove_original_mirrors() {
 | 
				
			|||||||
        fi
 | 
					        fi
 | 
				
			||||||
        rm -rf $Dir_YumRepos/openEuler.repo
 | 
					        rm -rf $Dir_YumRepos/openEuler.repo
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
 | 
					    "${SYSTEM_OPENCLOUDOS}")
 | 
				
			||||||
 | 
					        if [ ! -d $Dir_YumRepos ]; then
 | 
				
			||||||
 | 
					            mkdir -p $Dir_YumRepos
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        rm -rf $Dir_YumRepos/OpenCloudOS*
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        if [ ! -d $Dir_YumRepos ]; then
 | 
					        if [ ! -d $Dir_YumRepos ]; then
 | 
				
			||||||
            mkdir -p $Dir_YumRepos
 | 
					            mkdir -p $Dir_YumRepos
 | 
				
			||||||
@@ -1494,7 +1565,7 @@ function change_mirrors_main() {
 | 
				
			|||||||
                    diff_file $File_LinuxMintSourceListBackup $File_LinuxMintSourceList
 | 
					                    diff_file $File_LinuxMintSourceListBackup $File_LinuxMintSourceList
 | 
				
			||||||
                fi
 | 
					                fi
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
                diff_dir $Dir_YumReposBackup $Dir_YumRepos
 | 
					                diff_dir $Dir_YumReposBackup $Dir_YumRepos
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            "${SYSTEM_OPENSUSE}")
 | 
					            "${SYSTEM_OPENSUSE}")
 | 
				
			||||||
@@ -1522,12 +1593,12 @@ function change_mirrors_main() {
 | 
				
			|||||||
    "${SYSTEM_REDHAT}")
 | 
					    "${SYSTEM_REDHAT}")
 | 
				
			||||||
        change_mirrors_RedHat
 | 
					        change_mirrors_RedHat
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENCLOUDOS}")
 | 
					 | 
				
			||||||
        change_mirrors_OpenCloudOS
 | 
					 | 
				
			||||||
        ;;
 | 
					 | 
				
			||||||
    "${SYSTEM_OPENEULER}")
 | 
					    "${SYSTEM_OPENEULER}")
 | 
				
			||||||
        change_mirrors_openEuler
 | 
					        change_mirrors_openEuler
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
 | 
					    "${SYSTEM_OPENCLOUDOS}")
 | 
				
			||||||
 | 
					        change_mirrors_OpenCloudOS
 | 
				
			||||||
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        change_mirrors_AnolisOS
 | 
					        change_mirrors_AnolisOS
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
@@ -1557,7 +1628,7 @@ function change_mirrors_main() {
 | 
				
			|||||||
    "${SYSTEM_DEBIAN}" | "${SYSTEM_OPENKYLIN}")
 | 
					    "${SYSTEM_DEBIAN}" | "${SYSTEM_OPENKYLIN}")
 | 
				
			||||||
        apt-get update
 | 
					        apt-get update
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        local package_manager="$(get_package_manager)"
 | 
					        local package_manager="$(get_package_manager)"
 | 
				
			||||||
        $package_manager makecache
 | 
					        $package_manager makecache
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
@@ -1595,6 +1666,13 @@ function upgrade_software() {
 | 
				
			|||||||
        ## 交互确认
 | 
					        ## 交互确认
 | 
				
			||||||
        if [[ -z "${CLEAN_CACHE}" ]]; then
 | 
					        if [[ -z "${CLEAN_CACHE}" ]]; then
 | 
				
			||||||
            CLEAN_CACHE="false"
 | 
					            CLEAN_CACHE="false"
 | 
				
			||||||
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}是否清理已下载的软件包缓存?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    CLEAN_CACHE="true"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
                local CHOICE=$(echo -e "\n${BOLD}└─ 是否清理已下载的软件包缓存? [Y/n] ${PLAIN}")
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 是否清理已下载的软件包缓存? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1608,6 +1686,7 @@ function upgrade_software() {
 | 
				
			|||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        if [[ "${CLEAN_CACHE}" == "false" ]]; then
 | 
					        if [[ "${CLEAN_CACHE}" == "false" ]]; then
 | 
				
			||||||
            return
 | 
					            return
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
@@ -1617,7 +1696,7 @@ function upgrade_software() {
 | 
				
			|||||||
            apt-get autoremove -y >/dev/null 2>&1
 | 
					            apt-get autoremove -y >/dev/null 2>&1
 | 
				
			||||||
            apt-get clean >/dev/null 2>&1
 | 
					            apt-get clean >/dev/null 2>&1
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
            local package_manager="$(get_package_manager)"
 | 
					            local package_manager="$(get_package_manager)"
 | 
				
			||||||
            $package_manager autoremove -y >/dev/null 2>&1
 | 
					            $package_manager autoremove -y >/dev/null 2>&1
 | 
				
			||||||
            $package_manager clean packages -y >/dev/null 2>&1
 | 
					            $package_manager clean packages -y >/dev/null 2>&1
 | 
				
			||||||
@@ -1646,6 +1725,13 @@ function upgrade_software() {
 | 
				
			|||||||
    ## 交互确认
 | 
					    ## 交互确认
 | 
				
			||||||
    if [[ -z "${UPGRADE_SOFTWARE}" ]]; then
 | 
					    if [[ -z "${UPGRADE_SOFTWARE}" ]]; then
 | 
				
			||||||
        UPGRADE_SOFTWARE="false"
 | 
					        UPGRADE_SOFTWARE="false"
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            echo ''
 | 
				
			||||||
 | 
					            interactive_select_boolean "${BOLD}是否跳过更新软件包?${PLAIN}"
 | 
				
			||||||
 | 
					            if [[ "${_SELECT_RESULT}" == "false" ]]; then
 | 
				
			||||||
 | 
					                UPGRADE_SOFTWARE="true"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            local CHOICE=$(echo -e "\n${BOLD}└─ 是否跳过更新软件包? [Y/n] ${PLAIN}")
 | 
					            local CHOICE=$(echo -e "\n${BOLD}└─ 是否跳过更新软件包? [Y/n] ${PLAIN}")
 | 
				
			||||||
            read -rp "${CHOICE}" INPUT
 | 
					            read -rp "${CHOICE}" INPUT
 | 
				
			||||||
            [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					            [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -1659,6 +1745,7 @@ function upgrade_software() {
 | 
				
			|||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            esac
 | 
					            esac
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
    if [[ "${UPGRADE_SOFTWARE}" == "false" ]]; then
 | 
					    if [[ "${UPGRADE_SOFTWARE}" == "false" ]]; then
 | 
				
			||||||
        return
 | 
					        return
 | 
				
			||||||
    fi
 | 
					    fi
 | 
				
			||||||
@@ -1668,7 +1755,7 @@ function upgrade_software() {
 | 
				
			|||||||
    "${SYSTEM_DEBIAN}" | "${SYSTEM_OPENKYLIN}")
 | 
					    "${SYSTEM_DEBIAN}" | "${SYSTEM_OPENKYLIN}")
 | 
				
			||||||
        apt-get upgrade -y
 | 
					        apt-get upgrade -y
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        local package_manager="$(get_package_manager)"
 | 
					        local package_manager="$(get_package_manager)"
 | 
				
			||||||
        $package_manager update -y --skip-broken
 | 
					        $package_manager update -y --skip-broken
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
@@ -2336,13 +2423,178 @@ function get_package_manager() {
 | 
				
			|||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_FEDORA}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_FEDORA}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        command="dnf"
 | 
					        command="dnf"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
    echo "${command}"
 | 
					    echo "${command}"
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function interactive_select_mirror() {
 | 
				
			||||||
 | 
					    _SELECT_RESULT=""
 | 
				
			||||||
 | 
					    local options=("$@")
 | 
				
			||||||
 | 
					    local message="${options[${#options[@]} - 1]}"
 | 
				
			||||||
 | 
					    unset options[${#options[@]}-1]
 | 
				
			||||||
 | 
					    local selected=0
 | 
				
			||||||
 | 
					    local start=0
 | 
				
			||||||
 | 
					    local page_size=$(($(tput lines) - 3)) # 减去1行用于显示提示信息
 | 
				
			||||||
 | 
					    function clear_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        for ((i = 0; i < ${#options[@]} + 1; i++)); do
 | 
				
			||||||
 | 
					            echo -e "\r\033[K"
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function cleanup() {
 | 
				
			||||||
 | 
					        clear_menu
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        tput cnorm
 | 
				
			||||||
 | 
					        tput rmcup
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function draw_menu() {
 | 
				
			||||||
 | 
					        tput clear
 | 
				
			||||||
 | 
					        tput cup 0 0
 | 
				
			||||||
 | 
					        echo -e "${message}"
 | 
				
			||||||
 | 
					        local end=$((start + page_size - 1))
 | 
				
			||||||
 | 
					        if [ $end -ge ${#options[@]} ]; then
 | 
				
			||||||
 | 
					            end=${#options[@]}-1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        for ((i = start; i <= end; i++)); do
 | 
				
			||||||
 | 
					            if [ "$i" -eq "$selected" ]; then
 | 
				
			||||||
 | 
					                echo -e "\e[34;4m➤ ${options[$i]%@*}\e[0m"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                echo -e "  ${options[$i]%@*}"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function read_key() {
 | 
				
			||||||
 | 
					        IFS= read -rsn1 key
 | 
				
			||||||
 | 
					        if [[ $key == $'\x1b' ]]; then
 | 
				
			||||||
 | 
					            IFS= read -rsn2 key
 | 
				
			||||||
 | 
					            key="$key"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        echo "$key"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    tput smcup              # 保存当前屏幕并切换到新屏幕
 | 
				
			||||||
 | 
					    tput sc                 # 保存光标位置
 | 
				
			||||||
 | 
					    tput civis              # 隐藏光标
 | 
				
			||||||
 | 
					    trap "cleanup" INT TERM # 捕捉脚本结束时恢复光标
 | 
				
			||||||
 | 
					    draw_menu               # 初始化菜单位置
 | 
				
			||||||
 | 
					    # 处理选择
 | 
				
			||||||
 | 
					    while true; do
 | 
				
			||||||
 | 
					        key=$(read_key)
 | 
				
			||||||
 | 
					        case "$key" in
 | 
				
			||||||
 | 
					        "[A")
 | 
				
			||||||
 | 
					            # 上箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -gt 0 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected - 1))
 | 
				
			||||||
 | 
					                if [ "$selected" -lt "$start" ]; then
 | 
				
			||||||
 | 
					                    start=$((start - 1))
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "[B")
 | 
				
			||||||
 | 
					            # 下箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -lt $((${#options[@]} - 1)) ]; then
 | 
				
			||||||
 | 
					                selected=$((selected + 1))
 | 
				
			||||||
 | 
					                if [ "$selected" -ge $((start + page_size)) ]; then
 | 
				
			||||||
 | 
					                    start=$((start + 1))
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "")
 | 
				
			||||||
 | 
					            # Enter 键
 | 
				
			||||||
 | 
					            tput rmcup
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        *) ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					        draw_menu
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    # clear_menu # 清除菜单
 | 
				
			||||||
 | 
					    tput cnorm # 恢复光标
 | 
				
			||||||
 | 
					    tput rmcup # 恢复之前的屏幕
 | 
				
			||||||
 | 
					    # tput rc    # 恢复光标位置
 | 
				
			||||||
 | 
					    # 处理结果
 | 
				
			||||||
 | 
					    _SELECT_RESULT="${options[$selected]}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function interactive_select_boolean() {
 | 
				
			||||||
 | 
					    _SELECT_RESULT=""
 | 
				
			||||||
 | 
					    local selected=0
 | 
				
			||||||
 | 
					    local message="$1"
 | 
				
			||||||
 | 
					    function clear_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        for ((i = 0; i < 2 + 2; i++)); do
 | 
				
			||||||
 | 
					            echo -e "\r\033[K"
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function cleanup() {
 | 
				
			||||||
 | 
					        clear_menu
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        tput cnorm
 | 
				
			||||||
 | 
					        tput rmcup
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function draw_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        echo -e "╭─ ${message}"
 | 
				
			||||||
 | 
					        echo -e "│"
 | 
				
			||||||
 | 
					        if [ "$selected" -eq 0 ]; then
 | 
				
			||||||
 | 
					            echo -e "╰─ \033[32m●\033[0m 是\033[2m / ○ 否\033[0m"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m 否"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function read_key() {
 | 
				
			||||||
 | 
					        IFS= read -rsn1 key
 | 
				
			||||||
 | 
					        if [[ $key == $'\x1b' ]]; then
 | 
				
			||||||
 | 
					            IFS= read -rsn2 key
 | 
				
			||||||
 | 
					            key="$key"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        echo "$key"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    tput sc                 # 保存光标位置
 | 
				
			||||||
 | 
					    tput civis              # 隐藏光标
 | 
				
			||||||
 | 
					    trap "cleanup" INT TERM # 捕捉脚本结束时恢复光标
 | 
				
			||||||
 | 
					    draw_menu               # 初始化菜单位置
 | 
				
			||||||
 | 
					    # 处理选择
 | 
				
			||||||
 | 
					    while true; do
 | 
				
			||||||
 | 
					        key=$(read_key)
 | 
				
			||||||
 | 
					        case "$key" in
 | 
				
			||||||
 | 
					        "[D")
 | 
				
			||||||
 | 
					            # 左箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -gt 0 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected - 1))
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "[C")
 | 
				
			||||||
 | 
					            # 右箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -lt 1 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected + 1))
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "")
 | 
				
			||||||
 | 
					            # Enter 键
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        *) ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					        draw_menu
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    # clear_menu # 清除菜单
 | 
				
			||||||
 | 
					    tput cnorm # 恢复光标
 | 
				
			||||||
 | 
					    # tput rc    # 恢复光标位置
 | 
				
			||||||
 | 
					    # 处理结果
 | 
				
			||||||
 | 
					    if [ "$selected" -eq 0 ]; then
 | 
				
			||||||
 | 
					        _SELECT_RESULT="true"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        _SELECT_RESULT="false"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
##############################################################################
 | 
					##############################################################################
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 生成 CentOS 官方 repo 源文件
 | 
					## 生成 CentOS 官方 repo 源文件
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
#!/bin/bash
 | 
					#!/bin/bash
 | 
				
			||||||
## Author: SuperManito
 | 
					## Author: SuperManito
 | 
				
			||||||
## Modified: 2024-12-05
 | 
					## Modified: 2024-12-06
 | 
				
			||||||
## License: MIT
 | 
					## License: MIT
 | 
				
			||||||
## GitHub: https://github.com/SuperManito/LinuxMirrors
 | 
					## GitHub: https://github.com/SuperManito/LinuxMirrors
 | 
				
			||||||
## Website: https://linuxmirrors.cn
 | 
					## Website: https://linuxmirrors.cn
 | 
				
			||||||
@@ -83,8 +83,8 @@ File_LinuxRelease=/etc/os-release
 | 
				
			|||||||
File_RedHatRelease=/etc/redhat-release
 | 
					File_RedHatRelease=/etc/redhat-release
 | 
				
			||||||
File_DebianVersion=/etc/debian_version
 | 
					File_DebianVersion=/etc/debian_version
 | 
				
			||||||
File_ArmbianRelease=/etc/armbian-release
 | 
					File_ArmbianRelease=/etc/armbian-release
 | 
				
			||||||
File_OpenCloudOSRelease=/etc/opencloudos-release
 | 
					 | 
				
			||||||
File_openEulerRelease=/etc/openEuler-release
 | 
					File_openEulerRelease=/etc/openEuler-release
 | 
				
			||||||
 | 
					File_OpenCloudOSRelease=/etc/opencloudos-release
 | 
				
			||||||
File_AnolisOSRelease=/etc/anolis-release
 | 
					File_AnolisOSRelease=/etc/anolis-release
 | 
				
			||||||
File_ArchLinuxRelease=/etc/arch-release
 | 
					File_ArchLinuxRelease=/etc/arch-release
 | 
				
			||||||
File_AlpineRelease=/etc/alpine-release
 | 
					File_AlpineRelease=/etc/alpine-release
 | 
				
			||||||
@@ -112,13 +112,13 @@ PURPLE='\033[35m'
 | 
				
			|||||||
AZURE='\033[36m'
 | 
					AZURE='\033[36m'
 | 
				
			||||||
PLAIN='\033[0m'
 | 
					PLAIN='\033[0m'
 | 
				
			||||||
BOLD='\033[1m'
 | 
					BOLD='\033[1m'
 | 
				
			||||||
SUCCESS="\033[1;32m✔${PLAIN}"
 | 
					SUCCESS=" \033[1;32m✔${PLAIN}"
 | 
				
			||||||
COMPLETE="\033[1;32m✔${PLAIN}"
 | 
					COMPLETE=" \033[1;32m✔${PLAIN}"
 | 
				
			||||||
WARN="\033[1;43m 警告 ${PLAIN}"
 | 
					WARN=" \033[1;43m 警告 ${PLAIN}"
 | 
				
			||||||
ERROR="\033[1;31m✘${PLAIN}"
 | 
					ERROR=" \033[1;31m✘${PLAIN}"
 | 
				
			||||||
FAIL="\033[1;31m✘${PLAIN}"
 | 
					FAIL=" \033[1;31m✘${PLAIN}"
 | 
				
			||||||
TIP="\033[1;44m 提示 ${PLAIN}"
 | 
					TIP=" \033[1;44m 提示 ${PLAIN}"
 | 
				
			||||||
WORKING="\033[1;36m>_${PLAIN}"
 | 
					WORKING=" \033[1;36m>_${PLAIN}"
 | 
				
			||||||
# SUCCESS="[\033[1;32m成功${PLAIN}]"
 | 
					# SUCCESS="[\033[1;32m成功${PLAIN}]"
 | 
				
			||||||
# COMPLETE="[\033[1;32m完成${PLAIN}]"
 | 
					# COMPLETE="[\033[1;32m完成${PLAIN}]"
 | 
				
			||||||
# WARN="[\033[1;5;33m注意${PLAIN}]"
 | 
					# WARN="[\033[1;5;33m注意${PLAIN}]"
 | 
				
			||||||
@@ -264,7 +264,7 @@ function run_start() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
## 运行结束
 | 
					## 运行结束
 | 
				
			||||||
function run_end() {
 | 
					function run_end() {
 | 
				
			||||||
    echo -e "\n✨️ \033[1;34mPowered by https://linuxmirrors.cn\033[0m\n"
 | 
					    echo -e "\n ✨️ \033[1;34mPowered by https://linuxmirrors.cn\033[0m\n"
 | 
				
			||||||
    # echo -e "\n     ------ 脚本运行结束 ------"
 | 
					    # echo -e "\n     ------ 脚本运行结束 ------"
 | 
				
			||||||
    # echo -e ' \033[0;1;35;95m┌─\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m┐\033[0m'
 | 
					    # echo -e ' \033[0;1;35;95m┌─\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m──\033[0;1;34;94m──\033[0;1;35;95m──\033[0;1;31;91m──\033[0;1;33;93m──\033[0;1;32;92m──\033[0;1;36;96m┐\033[0m'
 | 
				
			||||||
    # echo -e ' \033[0;1;31;91m│▞\033[0;1;33;93m▀▖\033[0m            \033[0;1;32;92m▙▗\033[0;1;36;96m▌\033[0m      \033[0;1;31;91m▗\033[0;1;33;93m▐\033[0m     \033[0;1;34;94m│\033[0m'
 | 
					    # echo -e ' \033[0;1;31;91m│▞\033[0;1;33;93m▀▖\033[0m            \033[0;1;32;92m▙▗\033[0;1;36;96m▌\033[0m      \033[0;1;31;91m▗\033[0;1;33;93m▐\033[0m     \033[0;1;34;94m│\033[0m'
 | 
				
			||||||
@@ -304,14 +304,14 @@ function collect_system_info() {
 | 
				
			|||||||
        SYSTEM_FACTIONS="${SYSTEM_DEBIAN}"
 | 
					        SYSTEM_FACTIONS="${SYSTEM_DEBIAN}"
 | 
				
			||||||
    elif [ -s $File_RedHatRelease ]; then
 | 
					    elif [ -s $File_RedHatRelease ]; then
 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_REDHAT}"
 | 
					        SYSTEM_FACTIONS="${SYSTEM_REDHAT}"
 | 
				
			||||||
 | 
					    elif [ -s $File_openEulerRelease ]; then
 | 
				
			||||||
 | 
					        SYSTEM_FACTIONS="${SYSTEM_OPENEULER}"
 | 
				
			||||||
    elif [ -s $File_OpenCloudOSRelease ]; then
 | 
					    elif [ -s $File_OpenCloudOSRelease ]; then
 | 
				
			||||||
        # 拦截 OpenCloudOS 9 及以上版本,非红帽版本不支持从 Docker 官方仓库安装
 | 
					        # 拦截 OpenCloudOS 9 及以上版本,非红帽版本不支持从 Docker 官方仓库安装
 | 
				
			||||||
        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" -ge 9 ]]; then
 | 
					        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" -ge 9 ]]; then
 | 
				
			||||||
            output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
 | 
					            output_error "不支持当前操作系统,请参考如下命令自行安装:\n\ndnf install -y docker\nsystemctl enable --now docker"
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_OPENCLOUDOS}" # 自 9.0 版本起不再基于红帽
 | 
					        SYSTEM_FACTIONS="${SYSTEM_OPENCLOUDOS}" # 自 9.0 版本起不再基于红帽
 | 
				
			||||||
    elif [ -s $File_openEulerRelease ]; then
 | 
					 | 
				
			||||||
        SYSTEM_FACTIONS="${SYSTEM_OPENEULER}"
 | 
					 | 
				
			||||||
    elif [ -s $File_AnolisOSRelease ]; then
 | 
					    elif [ -s $File_AnolisOSRelease ]; then
 | 
				
			||||||
        # 拦截 Anolis OS 8 版本,不支持从 Docker 官方仓库安装
 | 
					        # 拦截 Anolis OS 8 版本,不支持从 Docker 官方仓库安装
 | 
				
			||||||
        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" == 8 ]]; then
 | 
					        if [[ "${SYSTEM_VERSION_NUMBER_MAJOR}" == 8 ]]; then
 | 
				
			||||||
@@ -415,7 +415,7 @@ function collect_system_info() {
 | 
				
			|||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        SOURCE_BRANCH="centos"
 | 
					        SOURCE_BRANCH="centos"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
@@ -424,10 +424,15 @@ function collect_system_info() {
 | 
				
			|||||||
    "${SYSTEM_DEBIAN}")
 | 
					    "${SYSTEM_DEBIAN}")
 | 
				
			||||||
        SYNC_MIRROR_TEXT="更新软件源"
 | 
					        SYNC_MIRROR_TEXT="更新软件源"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        SYNC_MIRROR_TEXT="生成软件源缓存"
 | 
					        SYNC_MIRROR_TEXT="生成软件源缓存"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
 | 
					    ## 判断是否可以使用高级交互式选择器
 | 
				
			||||||
 | 
					    CAN_USE_ADVANCED_INTERACTIVE_SELECTION="false"
 | 
				
			||||||
 | 
					    if [ ! -z "$(command -v tput)" ]; then
 | 
				
			||||||
 | 
					        CAN_USE_ADVANCED_INTERACTIVE_SELECTION="true"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function choose_mirrors() {
 | 
					function choose_mirrors() {
 | 
				
			||||||
@@ -468,8 +473,8 @@ function choose_mirrors() {
 | 
				
			|||||||
            done
 | 
					            done
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
            for ((i = 0; i < ${#list_arr[@]}; i++)); do
 | 
					            for ((i = 0; i < ${#list_arr[@]}; i++)); do
 | 
				
			||||||
                tmp_mirror_name=$(echo "${list_arr[i]}" | awk -F '@' '{print$1}') # 软件源名称
 | 
					                tmp_mirror_name="${list_arr[i]%@*}" # 软件源名称
 | 
				
			||||||
                tmp_mirror_url=$(echo "${list_arr[i]}" | awk -F '@' '{print$2}')  # 软件源地址
 | 
					                tmp_mirror_url="${list_arr[i]#*@}"  # 软件源地址
 | 
				
			||||||
                arr_num=$((i + 1))
 | 
					                arr_num=$((i + 1))
 | 
				
			||||||
                echo -e " ❖  $arr_num. ${tmp_mirror_url} | ${tmp_mirror_name}"
 | 
					                echo -e " ❖  $arr_num. ${tmp_mirror_url} | ${tmp_mirror_name}"
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
@@ -491,6 +496,17 @@ function choose_mirrors() {
 | 
				
			|||||||
    print_title
 | 
					    print_title
 | 
				
			||||||
    if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
 | 
					    if [[ -z "${INSTALL_LATESTED_DOCKER}" ]]; then
 | 
				
			||||||
        ## 是否手动选择安装版本
 | 
					        ## 是否手动选择安装版本
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            echo ''
 | 
				
			||||||
 | 
					            interactive_select_boolean "${BOLD}是否安装最新版本的 Docker Engine?${PLAIN}"
 | 
				
			||||||
 | 
					            if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                INSTALL_LATESTED_DOCKER="true"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                ## 安装旧版本只有官方仓库有
 | 
				
			||||||
 | 
					                INSTALL_LATESTED_DOCKER="false"
 | 
				
			||||||
 | 
					                SOURCE="download.docker.com"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            local CHOICE_A=$(echo -e "\n${BOLD}└─ 是否安装最新版本的 Docker Engine? [Y/n] ${PLAIN}")
 | 
					            local CHOICE_A=$(echo -e "\n${BOLD}└─ 是否安装最新版本的 Docker Engine? [Y/n] ${PLAIN}")
 | 
				
			||||||
            read -p "${CHOICE_A}" INPUT
 | 
					            read -p "${CHOICE_A}" INPUT
 | 
				
			||||||
            [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					            [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -509,10 +525,17 @@ function choose_mirrors() {
 | 
				
			|||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            esac
 | 
					            esac
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    local mirror_list_name
 | 
					    local mirror_list_name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ -z "${SOURCE}" ]]; then
 | 
					    if [[ -z "${SOURCE}" ]]; then
 | 
				
			||||||
        local mirror_list_name="mirror_list_docker_ce"
 | 
					        mirror_list_name="mirror_list_docker_ce"
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想使用的 Docker CE 源:\${PLAIN}\\n\""
 | 
				
			||||||
 | 
					            SOURCE="${_SELECT_RESULT#*@}"
 | 
				
			||||||
 | 
					            echo -e "\n ${GREEN}➜${PLAIN}  ${BOLD}${_SELECT_RESULT%@*}${PLAIN}"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            print_mirrors_list "${mirror_list_name}" 38
 | 
					            print_mirrors_list "${mirror_list_name}" 38
 | 
				
			||||||
            local CHOICE_B=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker CE 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
					            local CHOICE_B=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker CE 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
				
			||||||
            while true; do
 | 
					            while true; do
 | 
				
			||||||
@@ -524,8 +547,6 @@ function choose_mirrors() {
 | 
				
			|||||||
                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
					                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        SOURCE="$(eval echo \${${mirror_list_name}[$(($INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
					                        SOURCE="$(eval echo \${${mirror_list_name}[$(($INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
				
			||||||
                    # echo "${SOURCE}"
 | 
					 | 
				
			||||||
                    # exit
 | 
					 | 
				
			||||||
                        break
 | 
					                        break
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
@@ -535,9 +556,15 @@ function choose_mirrors() {
 | 
				
			|||||||
                esac
 | 
					                esac
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if [[ -z "${SOURCE_REGISTRY}" ]]; then
 | 
					    if [[ -z "${SOURCE_REGISTRY}" ]]; then
 | 
				
			||||||
        mirror_list_name="mirror_list_registry"
 | 
					        mirror_list_name="mirror_list_registry"
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            eval "interactive_select_mirror \"\${${mirror_list_name}[@]}\" \"\\n \${BOLD}请选择你想使用的 Docker Registry 源:\${PLAIN}\\n\""
 | 
				
			||||||
 | 
					            SOURCE_REGISTRY="${_SELECT_RESULT#*@}"
 | 
				
			||||||
 | 
					            echo -e "\n ${GREEN}➜${PLAIN}  Docker Registry:${BOLD}${_SELECT_RESULT%@*}${PLAIN}"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            print_mirrors_list "${mirror_list_name}" 44
 | 
					            print_mirrors_list "${mirror_list_name}" 44
 | 
				
			||||||
            local CHOICE_C=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker Registry 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
					            local CHOICE_C=$(echo -e "\n${BOLD}└─ 请选择并输入你想使用的 Docker Registry 源 [ 1-$(eval echo \${#$mirror_list_name[@]}) ]:${PLAIN}")
 | 
				
			||||||
            while true; do
 | 
					            while true; do
 | 
				
			||||||
@@ -549,8 +576,6 @@ function choose_mirrors() {
 | 
				
			|||||||
                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
					                        echo -e "\n$WARN 请输入有效的数字序号!"
 | 
				
			||||||
                    else
 | 
					                    else
 | 
				
			||||||
                        SOURCE_REGISTRY="$(eval echo \${${mirror_list_name}[$(($INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
					                        SOURCE_REGISTRY="$(eval echo \${${mirror_list_name}[$(($INPUT - 1))]} | awk -F '@' '{print$2}')"
 | 
				
			||||||
                    # echo "${SOURCE_REGISTRY}"
 | 
					 | 
				
			||||||
                    # exit
 | 
					 | 
				
			||||||
                        break
 | 
					                        break
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
@@ -560,6 +585,7 @@ function choose_mirrors() {
 | 
				
			|||||||
                esac
 | 
					                esac
 | 
				
			||||||
            done
 | 
					            done
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## 关闭防火墙和SELinux
 | 
					## 关闭防火墙和SELinux
 | 
				
			||||||
@@ -569,8 +595,14 @@ function close_firewall_service() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
    if [[ "$(systemctl is-active firewalld)" == "active" ]]; then
 | 
					    if [[ "$(systemctl is-active firewalld)" == "active" ]]; then
 | 
				
			||||||
        if [[ -z "${CLOSE_FIREWALL}" ]]; then
 | 
					        if [[ -z "${CLOSE_FIREWALL}" ]]; then
 | 
				
			||||||
            local CHOICE
 | 
					            if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
            CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}")
 | 
					                echo ''
 | 
				
			||||||
 | 
					                interactive_select_boolean "${BOLD}是否关闭防火墙和 SELinux ?${PLAIN}"
 | 
				
			||||||
 | 
					                if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    CLOSE_FIREWALL="true"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                local CHOICE=$(echo -e "\n${BOLD}└─ 是否关闭防火墙和 SELinux ? [Y/n] ${PLAIN}")
 | 
				
			||||||
                read -rp "${CHOICE}" INPUT
 | 
					                read -rp "${CHOICE}" INPUT
 | 
				
			||||||
                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
                case "${INPUT}" in
 | 
					                case "${INPUT}" in
 | 
				
			||||||
@@ -583,6 +615,7 @@ function close_firewall_service() {
 | 
				
			|||||||
                    ;;
 | 
					                    ;;
 | 
				
			||||||
                esac
 | 
					                esac
 | 
				
			||||||
            fi
 | 
					            fi
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        if [[ "${CLOSE_FIREWALL}" == "true" ]]; then
 | 
					        if [[ "${CLOSE_FIREWALL}" == "true" ]]; then
 | 
				
			||||||
            local SelinuxConfig=/etc/selinux/config
 | 
					            local SelinuxConfig=/etc/selinux/config
 | 
				
			||||||
            systemctl disable --now firewalld >/dev/null 2>&1
 | 
					            systemctl disable --now firewalld >/dev/null 2>&1
 | 
				
			||||||
@@ -600,7 +633,7 @@ function install_dependency_packages() {
 | 
				
			|||||||
        sed -i '/docker-ce/d' $File_DebianSourceList
 | 
					        sed -i '/docker-ce/d' $File_DebianSourceList
 | 
				
			||||||
        rm -rf $Dir_DebianExtendSource/docker.list
 | 
					        rm -rf $Dir_DebianExtendSource/docker.list
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        rm -rf $Dir_YumRepos/*docker*.repo
 | 
					        rm -rf $Dir_YumRepos/*docker*.repo
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
@@ -610,7 +643,7 @@ function install_dependency_packages() {
 | 
				
			|||||||
        package_manager="apt-get"
 | 
					        package_manager="apt-get"
 | 
				
			||||||
        $package_manager update
 | 
					        $package_manager update
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        package_manager="$(get_package_manager)"
 | 
					        package_manager="$(get_package_manager)"
 | 
				
			||||||
        $package_manager makecache
 | 
					        $package_manager makecache
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
@@ -649,7 +682,7 @@ function get_package_manager() {
 | 
				
			|||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_FEDORA}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_FEDORA}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        command="dnf"
 | 
					        command="dnf"
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
@@ -674,7 +707,7 @@ function uninstall_original_version() {
 | 
				
			|||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        esac
 | 
					        esac
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        case "${SYSTEM_JUDGMENT}" in
 | 
					        case "${SYSTEM_JUDGMENT}" in
 | 
				
			||||||
        "${SYSTEM_FEDORA}" | "${SYSTEM_RHEL}")
 | 
					        "${SYSTEM_FEDORA}" | "${SYSTEM_RHEL}")
 | 
				
			||||||
            package_list="docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc"
 | 
					            package_list="docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine podman runc"
 | 
				
			||||||
@@ -691,7 +724,7 @@ function uninstall_original_version() {
 | 
				
			|||||||
        apt-get remove -y $package_list >/dev/null 2>&1
 | 
					        apt-get remove -y $package_list >/dev/null 2>&1
 | 
				
			||||||
        apt-get autoremove -y >/dev/null 2>&1
 | 
					        apt-get autoremove -y >/dev/null 2>&1
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        local package_manager="$(get_package_manager)"
 | 
					        local package_manager="$(get_package_manager)"
 | 
				
			||||||
        $package_manager remove -y $package_list >/dev/null 2>&1
 | 
					        $package_manager remove -y $package_list >/dev/null 2>&1
 | 
				
			||||||
        $package_manager autoremove -y >/dev/null 2>&1
 | 
					        $package_manager autoremove -y >/dev/null 2>&1
 | 
				
			||||||
@@ -717,7 +750,7 @@ function configure_docker_ce_mirror() {
 | 
				
			|||||||
        echo "deb [arch=${SOURCE_ARCH} signed-by=${file_keyring}] https://${SOURCE}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION_CODENAME} stable" | tee $Dir_DebianExtendSource/docker.list >/dev/null 2>&1
 | 
					        echo "deb [arch=${SOURCE_ARCH} signed-by=${file_keyring}] https://${SOURCE}/linux/${SOURCE_BRANCH} ${SYSTEM_VERSION_CODENAME} stable" | tee $Dir_DebianExtendSource/docker.list >/dev/null 2>&1
 | 
				
			||||||
        apt-get update
 | 
					        apt-get update
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        yum-config-manager -y --add-repo https://${SOURCE}/linux/${SOURCE_BRANCH}/docker-ce.repo
 | 
					        yum-config-manager -y --add-repo https://${SOURCE}/linux/${SOURCE_BRANCH}/docker-ce.repo
 | 
				
			||||||
        sed -i "s|download.docker.com|${SOURCE}|g" $Dir_YumRepos/docker-ce.repo
 | 
					        sed -i "s|download.docker.com|${SOURCE}|g" $Dir_YumRepos/docker-ce.repo
 | 
				
			||||||
        ## 兼容处理版本号
 | 
					        ## 兼容处理版本号
 | 
				
			||||||
@@ -749,7 +782,7 @@ function install_docker_engine() {
 | 
				
			|||||||
            apt-cache madison docker-ce-cli | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
 | 
					            apt-cache madison docker-ce-cli | awk '{print $3}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
 | 
				
			||||||
            grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
 | 
					            grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
 | 
				
			||||||
            ;;
 | 
					            ;;
 | 
				
			||||||
        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					        "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
            yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile
 | 
					            yum list docker-ce --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCEVersionFile
 | 
				
			||||||
            yum list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
 | 
					            yum list docker-ce-cli --showduplicates | sort -r | awk '{print $2}' | grep -Eo "[0-9][0-9].[0-9]{1,2}.[0-9]{1,2}" >$DockerCECLIVersionFile
 | 
				
			||||||
            grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
 | 
					            grep -wf $DockerCEVersionFile $DockerCECLIVersionFile >$DockerVersionFile
 | 
				
			||||||
@@ -765,7 +798,7 @@ function install_docker_engine() {
 | 
				
			|||||||
            "${SYSTEM_DEBIAN}")
 | 
					            "${SYSTEM_DEBIAN}")
 | 
				
			||||||
                apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 | 
					                apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
                local package_manager="$(get_package_manager)"
 | 
					                local package_manager="$(get_package_manager)"
 | 
				
			||||||
                $package_manager install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 | 
					                $package_manager install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
@@ -810,7 +843,7 @@ function install_docker_engine() {
 | 
				
			|||||||
                esac
 | 
					                esac
 | 
				
			||||||
                apt-get install -y docker-ce=${INSTALL_JUDGMENT}${DOCKER_VERSION}* docker-ce-cli=5:${DOCKER_VERSION}* containerd.io docker-buildx-plugin docker-compose-plugin
 | 
					                apt-get install -y docker-ce=${INSTALL_JUDGMENT}${DOCKER_VERSION}* docker-ce-cli=5:${DOCKER_VERSION}* containerd.io docker-buildx-plugin docker-compose-plugin
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
                local package_manager="$(get_package_manager)"
 | 
					                local package_manager="$(get_package_manager)"
 | 
				
			||||||
                $package_manager install -y docker-ce-${DOCKER_VERSION} docker-ce-cli-${DOCKER_VERSION} containerd.io docker-buildx-plugin docker-compose-plugin
 | 
					                $package_manager install -y docker-ce-${DOCKER_VERSION} docker-ce-cli-${DOCKER_VERSION} containerd.io docker-buildx-plugin docker-compose-plugin
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
@@ -820,10 +853,20 @@ function install_docker_engine() {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    ## 修改 Docker Registry 镜像仓库源
 | 
					    ## 修改 Docker Registry 镜像仓库源
 | 
				
			||||||
    function change_docker_registry_mirror() {
 | 
					    function change_docker_registry_mirror() {
 | 
				
			||||||
        if [[ "${REGISTRY_SOURCEL}" != "registry.hub.docker.com" ]]; then
 | 
					        if [[ "${REGISTRY_SOURCEL}" == "registry.hub.docker.com" ]]; then
 | 
				
			||||||
 | 
					            return
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
        if [ -d $DockerDir ] && [ -e $DockerConfig ]; then
 | 
					        if [ -d $DockerDir ] && [ -e $DockerConfig ]; then
 | 
				
			||||||
            if [ -e $DockerConfigBackup ]; then
 | 
					            if [ -e $DockerConfigBackup ]; then
 | 
				
			||||||
                if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then
 | 
					                if [[ "${IGNORE_BACKUP_TIPS}" == "false" ]]; then
 | 
				
			||||||
 | 
					                    if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					                        echo ''
 | 
				
			||||||
 | 
					                        interactive_select_boolean "${BOLD}检测到已备份的 Docker 配置文件,是否跳过覆盖备份?${PLAIN}"
 | 
				
			||||||
 | 
					                        if [[ "${_SELECT_RESULT}" == "false" ]]; then
 | 
				
			||||||
 | 
					                            echo ''
 | 
				
			||||||
 | 
					                            cp -rvf $DockerConfig $DockerConfigBackup 2>&1
 | 
				
			||||||
 | 
					                        fi
 | 
				
			||||||
 | 
					                    else
 | 
				
			||||||
                        local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到已备份的 Docker 配置文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
					                        local CHOICE_BACKUP=$(echo -e "\n${BOLD}└─ 检测到已备份的 Docker 配置文件,是否跳过覆盖备份? [Y/n] ${PLAIN}")
 | 
				
			||||||
                        read -p "${CHOICE_BACKUP}" INPUT
 | 
					                        read -p "${CHOICE_BACKUP}" INPUT
 | 
				
			||||||
                        [[ -z "${INPUT}" ]] && INPUT=Y
 | 
					                        [[ -z "${INPUT}" ]] && INPUT=Y
 | 
				
			||||||
@@ -838,6 +881,7 @@ function install_docker_engine() {
 | 
				
			|||||||
                            ;;
 | 
					                            ;;
 | 
				
			||||||
                        esac
 | 
					                        esac
 | 
				
			||||||
                    fi
 | 
					                    fi
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
            else
 | 
					            else
 | 
				
			||||||
                echo ''
 | 
					                echo ''
 | 
				
			||||||
                cp -rvf $DockerConfig $DockerConfigBackup 2>&1
 | 
					                cp -rvf $DockerConfig $DockerConfigBackup 2>&1
 | 
				
			||||||
@@ -854,7 +898,6 @@ function install_docker_engine() {
 | 
				
			|||||||
        if [[ $(systemctl is-active docker) == "active" ]]; then
 | 
					        if [[ $(systemctl is-active docker) == "active" ]]; then
 | 
				
			||||||
            systemctl restart docker
 | 
					            systemctl restart docker
 | 
				
			||||||
        fi
 | 
					        fi
 | 
				
			||||||
        fi
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ## 判定是否已安装
 | 
					    ## 判定是否已安装
 | 
				
			||||||
@@ -862,7 +905,7 @@ function install_docker_engine() {
 | 
				
			|||||||
    "${SYSTEM_DEBIAN}")
 | 
					    "${SYSTEM_DEBIAN}")
 | 
				
			||||||
        dpkg -l | grep docker-ce-cli -q
 | 
					        dpkg -l | grep docker-ce-cli -q
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					    "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
        rpm -qa | grep docker-ce-cli -q
 | 
					        rpm -qa | grep docker-ce-cli -q
 | 
				
			||||||
        ;;
 | 
					        ;;
 | 
				
			||||||
    esac
 | 
					    esac
 | 
				
			||||||
@@ -870,6 +913,34 @@ function install_docker_engine() {
 | 
				
			|||||||
        export_version_list
 | 
					        export_version_list
 | 
				
			||||||
        DOCKER_INSTALLED_VERSION="$(docker -v | grep -Eo "[0-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}")"
 | 
					        DOCKER_INSTALLED_VERSION="$(docker -v | grep -Eo "[0-9][0-9]\.[0-9]{1,2}\.[0-9]{1,2}")"
 | 
				
			||||||
        DOCKER_VERSION_LATEST="$(cat $DockerVersionFile | head -n 1)"
 | 
					        DOCKER_VERSION_LATEST="$(cat $DockerVersionFile | head -n 1)"
 | 
				
			||||||
 | 
					        if [[ "${CAN_USE_ADVANCED_INTERACTIVE_SELECTION}" == "true" ]]; then
 | 
				
			||||||
 | 
					            if [[ "${DOCKER_INSTALLED_VERSION}" == "${DOCKER_VERSION_LATEST}" ]]; then
 | 
				
			||||||
 | 
					                if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    echo -e "\n$COMPLETE 检测到已安装 Docker Engine 最新版本,跳过安装"
 | 
				
			||||||
 | 
					                    rm -rf $DockerVersionFile
 | 
				
			||||||
 | 
					                    change_docker_registry_mirror
 | 
				
			||||||
 | 
					                    systemctl enable --now docker >/dev/null 2>&1
 | 
				
			||||||
 | 
					                    check_version
 | 
				
			||||||
 | 
					                    run_end
 | 
				
			||||||
 | 
					                    exit
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    echo ''
 | 
				
			||||||
 | 
					                    interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 最新版本,是否继续安装其它版本?${PLAIN}"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                echo ''
 | 
				
			||||||
 | 
					                if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
 | 
				
			||||||
 | 
					                    interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 旧版本,是否覆盖安装为最新版本?${PLAIN}"
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                    interactive_select_boolean "${BOLD}检测到已安装 Docker Engine 旧版本,是否继续安装其它版本?${PLAIN}"
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            if [[ "${_SELECT_RESULT}" == "true" ]]; then
 | 
				
			||||||
 | 
					                uninstall_original_version
 | 
				
			||||||
 | 
					                install_main
 | 
				
			||||||
 | 
					                [ $? -ne 0 ] && output_error "安装 Docker Engine 失败"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
            if [[ "${DOCKER_INSTALLED_VERSION}" == "${DOCKER_VERSION_LATEST}" ]]; then
 | 
					            if [[ "${DOCKER_INSTALLED_VERSION}" == "${DOCKER_VERSION_LATEST}" ]]; then
 | 
				
			||||||
                if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
 | 
					                if [[ "${INSTALL_LATESTED_DOCKER}" == "true" ]]; then
 | 
				
			||||||
                    echo -e "\n$COMPLETE 检测到已安装 Docker Engine 最新版本,跳过安装"
 | 
					                    echo -e "\n$COMPLETE 检测到已安装 Docker Engine 最新版本,跳过安装"
 | 
				
			||||||
@@ -902,6 +973,8 @@ function install_docker_engine() {
 | 
				
			|||||||
                echo -e "\n$WARN 输入错误,默认不覆盖安装!\n"
 | 
					                echo -e "\n$WARN 输入错误,默认不覆盖安装!\n"
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            esac
 | 
					            esac
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        rm -rf $DockerVersionFile
 | 
					        rm -rf $DockerVersionFile
 | 
				
			||||||
    else
 | 
					    else
 | 
				
			||||||
        uninstall_original_version
 | 
					        uninstall_original_version
 | 
				
			||||||
@@ -927,7 +1000,7 @@ function check_version() {
 | 
				
			|||||||
                echo -e "\n检查源文件:cat $Dir_DebianExtendSource/docker.list"
 | 
					                echo -e "\n检查源文件:cat $Dir_DebianExtendSource/docker.list"
 | 
				
			||||||
                echo -e '请尝试手动执行安装命令:apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n'
 | 
					                echo -e '请尝试手动执行安装命令:apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n'
 | 
				
			||||||
                ;;
 | 
					                ;;
 | 
				
			||||||
            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_ANOLISOS}")
 | 
					            "${SYSTEM_REDHAT}" | "${SYSTEM_OPENEULER}" | "${SYSTEM_OPENCLOUDOS}" | "${SYSTEM_ANOLISOS}")
 | 
				
			||||||
                local package_manager="$(get_package_manager)"
 | 
					                local package_manager="$(get_package_manager)"
 | 
				
			||||||
                echo -e "\n检查源文件:cat $Dir_YumRepos/docker.repo"
 | 
					                echo -e "\n检查源文件:cat $Dir_YumRepos/docker.repo"
 | 
				
			||||||
                echo -e "请尝试手动执行安装命令:$package_manager install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n"
 | 
					                echo -e "请尝试手动执行安装命令:$package_manager install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin\n"
 | 
				
			||||||
@@ -951,5 +1024,170 @@ function check_version() {
 | 
				
			|||||||
    fi
 | 
					    fi
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function interactive_select_mirror() {
 | 
				
			||||||
 | 
					    _SELECT_RESULT=""
 | 
				
			||||||
 | 
					    local options=("$@")
 | 
				
			||||||
 | 
					    local message="${options[${#options[@]} - 1]}"
 | 
				
			||||||
 | 
					    unset options[${#options[@]}-1]
 | 
				
			||||||
 | 
					    local selected=0
 | 
				
			||||||
 | 
					    local start=0
 | 
				
			||||||
 | 
					    local page_size=$(($(tput lines) - 3)) # 减去1行用于显示提示信息
 | 
				
			||||||
 | 
					    function clear_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        for ((i = 0; i < ${#options[@]} + 1; i++)); do
 | 
				
			||||||
 | 
					            echo -e "\r\033[K"
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function cleanup() {
 | 
				
			||||||
 | 
					        clear_menu
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        tput cnorm
 | 
				
			||||||
 | 
					        tput rmcup
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function draw_menu() {
 | 
				
			||||||
 | 
					        tput clear
 | 
				
			||||||
 | 
					        tput cup 0 0
 | 
				
			||||||
 | 
					        echo -e "${message}"
 | 
				
			||||||
 | 
					        local end=$((start + page_size - 1))
 | 
				
			||||||
 | 
					        if [ $end -ge ${#options[@]} ]; then
 | 
				
			||||||
 | 
					            end=${#options[@]}-1
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        for ((i = start; i <= end; i++)); do
 | 
				
			||||||
 | 
					            if [ "$i" -eq "$selected" ]; then
 | 
				
			||||||
 | 
					                echo -e "\e[34;4m➤ ${options[$i]%@*}\e[0m"
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                echo -e "  ${options[$i]%@*}"
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function read_key() {
 | 
				
			||||||
 | 
					        IFS= read -rsn1 key
 | 
				
			||||||
 | 
					        if [[ $key == $'\x1b' ]]; then
 | 
				
			||||||
 | 
					            IFS= read -rsn2 key
 | 
				
			||||||
 | 
					            key="$key"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        echo "$key"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    tput smcup              # 保存当前屏幕并切换到新屏幕
 | 
				
			||||||
 | 
					    tput sc                 # 保存光标位置
 | 
				
			||||||
 | 
					    tput civis              # 隐藏光标
 | 
				
			||||||
 | 
					    trap "cleanup" INT TERM # 捕捉脚本结束时恢复光标
 | 
				
			||||||
 | 
					    draw_menu               # 初始化菜单位置
 | 
				
			||||||
 | 
					    # 处理选择
 | 
				
			||||||
 | 
					    while true; do
 | 
				
			||||||
 | 
					        key=$(read_key)
 | 
				
			||||||
 | 
					        case "$key" in
 | 
				
			||||||
 | 
					        "[A")
 | 
				
			||||||
 | 
					            # 上箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -gt 0 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected - 1))
 | 
				
			||||||
 | 
					                if [ "$selected" -lt "$start" ]; then
 | 
				
			||||||
 | 
					                    start=$((start - 1))
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "[B")
 | 
				
			||||||
 | 
					            # 下箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -lt $((${#options[@]} - 1)) ]; then
 | 
				
			||||||
 | 
					                selected=$((selected + 1))
 | 
				
			||||||
 | 
					                if [ "$selected" -ge $((start + page_size)) ]; then
 | 
				
			||||||
 | 
					                    start=$((start + 1))
 | 
				
			||||||
 | 
					                fi
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "")
 | 
				
			||||||
 | 
					            # Enter 键
 | 
				
			||||||
 | 
					            tput rmcup
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        *) ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					        draw_menu
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    # clear_menu # 清除菜单
 | 
				
			||||||
 | 
					    tput cnorm # 恢复光标
 | 
				
			||||||
 | 
					    tput rmcup # 恢复之前的屏幕
 | 
				
			||||||
 | 
					    # tput rc    # 恢复光标位置
 | 
				
			||||||
 | 
					    # 处理结果
 | 
				
			||||||
 | 
					    _SELECT_RESULT="${options[$selected]}"
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function interactive_select_boolean() {
 | 
				
			||||||
 | 
					    _SELECT_RESULT=""
 | 
				
			||||||
 | 
					    local selected=0
 | 
				
			||||||
 | 
					    local message="$1"
 | 
				
			||||||
 | 
					    function clear_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        for ((i = 0; i < 2 + 2; i++)); do
 | 
				
			||||||
 | 
					            echo -e "\r\033[K"
 | 
				
			||||||
 | 
					        done
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function cleanup() {
 | 
				
			||||||
 | 
					        clear_menu
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        tput cnorm
 | 
				
			||||||
 | 
					        tput rmcup
 | 
				
			||||||
 | 
					        exit
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function draw_menu() {
 | 
				
			||||||
 | 
					        tput rc
 | 
				
			||||||
 | 
					        echo -e "╭─ ${message}"
 | 
				
			||||||
 | 
					        echo -e "│"
 | 
				
			||||||
 | 
					        if [ "$selected" -eq 0 ]; then
 | 
				
			||||||
 | 
					            echo -e "╰─ \033[32m●\033[0m 是\033[2m / ○ 否\033[0m"
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            echo -e "╰─ \033[2m○ 是 / \033[0m\033[32m●\033[0m 否"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    function read_key() {
 | 
				
			||||||
 | 
					        IFS= read -rsn1 key
 | 
				
			||||||
 | 
					        if [[ $key == $'\x1b' ]]; then
 | 
				
			||||||
 | 
					            IFS= read -rsn2 key
 | 
				
			||||||
 | 
					            key="$key"
 | 
				
			||||||
 | 
					        fi
 | 
				
			||||||
 | 
					        echo "$key"
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    tput sc                 # 保存光标位置
 | 
				
			||||||
 | 
					    tput civis              # 隐藏光标
 | 
				
			||||||
 | 
					    trap "cleanup" INT TERM # 捕捉脚本结束时恢复光标
 | 
				
			||||||
 | 
					    draw_menu               # 初始化菜单位置
 | 
				
			||||||
 | 
					    # 处理选择
 | 
				
			||||||
 | 
					    while true; do
 | 
				
			||||||
 | 
					        key=$(read_key)
 | 
				
			||||||
 | 
					        case "$key" in
 | 
				
			||||||
 | 
					        "[D")
 | 
				
			||||||
 | 
					            # 左箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -gt 0 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected - 1))
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "[C")
 | 
				
			||||||
 | 
					            # 右箭头
 | 
				
			||||||
 | 
					            if [ "$selected" -lt 1 ]; then
 | 
				
			||||||
 | 
					                selected=$((selected + 1))
 | 
				
			||||||
 | 
					            fi
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        "")
 | 
				
			||||||
 | 
					            # Enter 键
 | 
				
			||||||
 | 
					            break
 | 
				
			||||||
 | 
					            ;;
 | 
				
			||||||
 | 
					        *) ;;
 | 
				
			||||||
 | 
					        esac
 | 
				
			||||||
 | 
					        draw_menu
 | 
				
			||||||
 | 
					    done
 | 
				
			||||||
 | 
					    # clear_menu # 清除菜单
 | 
				
			||||||
 | 
					    tput cnorm # 恢复光标
 | 
				
			||||||
 | 
					    # tput rc    # 恢复光标位置
 | 
				
			||||||
 | 
					    # 处理结果
 | 
				
			||||||
 | 
					    if [ "$selected" -eq 0 ]; then
 | 
				
			||||||
 | 
					        _SELECT_RESULT="true"
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        _SELECT_RESULT="false"
 | 
				
			||||||
 | 
					    fi
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
handle_command_options "$@"
 | 
					handle_command_options "$@"
 | 
				
			||||||
main
 | 
					main
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -70,14 +70,14 @@
 | 
				
			|||||||
        <td><a href="https://almalinux.org/zh-hans" target="_blank"><img src="./docs/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> AlmaLinux</td>
 | 
					        <td><a href="https://almalinux.org/zh-hans" target="_blank"><img src="./docs/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> AlmaLinux</td>
 | 
				
			||||||
        <td align="center">8 ~ 9</td>
 | 
					        <td align="center">8 ~ 9</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					 | 
				
			||||||
        <td><a href="https://www.opencloudos.org" target="_blank"><img src="./docs/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖)</td>
 | 
					 | 
				
			||||||
        <td align="center">8.6 ~ 9 / Stream 23</td>
 | 
					 | 
				
			||||||
    </tr>
 | 
					 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <td><a href="https://www.openeuler.org/zh" target="_blank"><img src="./docs/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉)</td>
 | 
					        <td><a href="https://www.openeuler.org/zh" target="_blank"><img src="./docs/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉)</td>
 | 
				
			||||||
        <td align="center">21 ~ 24</td>
 | 
					        <td align="center">21 ~ 24</td>
 | 
				
			||||||
    </tr>
 | 
					    </tr>
 | 
				
			||||||
 | 
					    <tr>
 | 
				
			||||||
 | 
					        <td><a href="https://www.opencloudos.org" target="_blank"><img src="./docs/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖)</td>
 | 
				
			||||||
 | 
					        <td align="center">8.6 ~ 9 / Stream 23</td>
 | 
				
			||||||
 | 
					    </tr>
 | 
				
			||||||
    <tr>
 | 
					    <tr>
 | 
				
			||||||
        <td><a href="https://www.openkylin.top" target="_blank"><img src="./docs/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟)</td>
 | 
					        <td><a href="https://www.openkylin.top" target="_blank"><img src="./docs/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟)</td>
 | 
				
			||||||
        <td align="center">all</td>
 | 
					        <td align="center">all</td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -88,8 +88,8 @@ hide:
 | 
				
			|||||||
| <a href="https://www.centos.org" target="_blank"><img src="/assets/images/icon/centos.svg" width="16" height="16" style="vertical-align: -0.1em"></a> CentOS | _7 ~ 8 / Stream 8 ~ 9_ |
 | 
					| <a href="https://www.centos.org" target="_blank"><img src="/assets/images/icon/centos.svg" width="16" height="16" style="vertical-align: -0.1em"></a> CentOS | _7 ~ 8 / Stream 8 ~ 9_ |
 | 
				
			||||||
| <a href="https://rockylinux.org" target="_blank"><img src="/assets/images/icon/rocky-linux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> Rocky Linux | _8 ~ 9_ |
 | 
					| <a href="https://rockylinux.org" target="_blank"><img src="/assets/images/icon/rocky-linux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> Rocky Linux | _8 ~ 9_ |
 | 
				
			||||||
| <a href="https://almalinux.org/zh-hans" target="_blank"><img src="/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.15em"></a> AlmaLinux | _8 ~ 9_ |
 | 
					| <a href="https://almalinux.org/zh-hans" target="_blank"><img src="/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.15em"></a> AlmaLinux | _8 ~ 9_ |
 | 
				
			||||||
| <a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖) | _8.6 ~ 9 / Stream 23_ |
 | 
					 | 
				
			||||||
| <a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉) | _21 ~ 24_ |
 | 
					| <a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉) | _21 ~ 24_ |
 | 
				
			||||||
 | 
					| <a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖) | _8.6 ~ 9 / Stream 23_ |
 | 
				
			||||||
| <a href="https://www.openkylin.top" target="_blank"><img src="/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟) | _all_ |
 | 
					| <a href="https://www.openkylin.top" target="_blank"><img src="/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟) | _all_ |
 | 
				
			||||||
| <a href="https://openanolis.cn" target="_blank"><img src="/assets/images/icon/anolis.png" width="16" height="16" style="vertical-align: -0.1em"></a> Anolis OS(龙蜥) | _8 / 23_ |
 | 
					| <a href="https://openanolis.cn" target="_blank"><img src="/assets/images/icon/anolis.png" width="16" height="16" style="vertical-align: -0.1em"></a> Anolis OS(龙蜥) | _8 / 23_ |
 | 
				
			||||||
| <a href="https://www.opensuse.org" target="_blank"><img src="/assets/images/icon/opensuse.svg" width="16" height="16"></a> openSUSE | _Leep 15 / Tumbleweed_ |
 | 
					| <a href="https://www.opensuse.org" target="_blank"><img src="/assets/images/icon/opensuse.svg" width="16" height="16"></a> openSUSE | _Leep 15 / Tumbleweed_ |
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -18,7 +18,7 @@ hide:
 | 
				
			|||||||
| [网易](https://mirrors.163.com "mirrors.163.com") | :unsupport: | :supported: | :unsupport: | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: |
 | 
					| [网易](https://mirrors.163.com "mirrors.163.com") | :unsupport: | :supported: | :unsupport: | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: |
 | 
				
			||||||
| [火山引擎](https://developer.volcengine.com/mirror "mirrors.volces.com") | :unsupport: | :unsupport: | :supported: | :supported: | :incompatible: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: |
 | 
					| [火山引擎](https://developer.volcengine.com/mirror "mirrors.volces.com") | :unsupport: | :unsupport: | :supported: | :supported: | :incompatible: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: |
 | 
				
			||||||
| [清华大学](https://mirrors.tuna.tsinghua.edu.cn "mirrors.tuna.tsinghua.edu.cn") | :supported: | :supported: | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :unsupport: |
 | 
					| [清华大学](https://mirrors.tuna.tsinghua.edu.cn "mirrors.tuna.tsinghua.edu.cn") | :supported: | :supported: | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :unsupport: |
 | 
				
			||||||
| [北京大学](https://mirrors.pku.edu.cn/Mirrors "mirrors.pku.edu.cn") | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: |
 | 
					| [北京大学](https://mirrors.pku.edu.cn/Mirrors "mirrors.pku.edu.cn") | :supported: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :supported: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: | :unsupport: |
 | 
				
			||||||
| [浙江大学](https://mirrors.zju.edu.cn "mirrors.zju.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :supported: | :unsupport: |
 | 
					| [浙江大学](https://mirrors.zju.edu.cn "mirrors.zju.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :supported: | :unsupport: |
 | 
				
			||||||
| [南京大学](https://mirrors.nju.edu.cn "mirrors.nju.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: |
 | 
					| [南京大学](https://mirrors.nju.edu.cn "mirrors.nju.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: |
 | 
				
			||||||
| [兰州大学](https://mirror.lzu.edu.cn "mirror.lzu.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: |
 | 
					| [兰州大学](https://mirror.lzu.edu.cn "mirror.lzu.edu.cn") | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :supported: | :unsupport: | :supported: | :unsupport: | :unsupport: | :supported: | :supported: | :unsupport: | :supported: |
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -35,11 +35,11 @@ hide:
 | 
				
			|||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
    <td><a href="https://zorin.com/os" target="_blank"><img src="/assets/images/icon/zorin-os.png" width="16" height="16" style="vertical-align: -0.3em"></a> Zorin OS</td>
 | 
					    <td><a href="https://zorin.com/os" target="_blank"><img src="/assets/images/icon/zorin-os.png" width="16" height="16" style="vertical-align: -0.3em"></a> Zorin OS</td>
 | 
				
			||||||
    <td><a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖)</td>
 | 
					    <td><a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉)</td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
    <td><a href="https://www.armbian.com" target="_blank"><img src="/assets/images/icon/armbian.png" width="16" height="16" style="vertical-align: -0.2em"></a> Armbian</td>
 | 
					    <td><a href="https://www.armbian.com" target="_blank"><img src="/assets/images/icon/armbian.png" width="16" height="16" style="vertical-align: -0.2em"></a> Armbian</td>
 | 
				
			||||||
    <td><a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉)</td>
 | 
					    <td><a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖)</td>
 | 
				
			||||||
</tr>
 | 
					</tr>
 | 
				
			||||||
<tr>
 | 
					<tr>
 | 
				
			||||||
    <td><a href="https://www.proxmox.com" target="_blank"><img src="/assets/images/icon/proxmox.svg" width="16" height="16" style="vertical-align: -0.2em"></a> Proxmox</td>
 | 
					    <td><a href="https://www.proxmox.com" target="_blank"><img src="/assets/images/icon/proxmox.svg" width="16" height="16" style="vertical-align: -0.2em"></a> Proxmox</td>
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -344,8 +344,8 @@ hide:
 | 
				
			|||||||
        | <a href="https://www.centos.org" target="_blank"><img src="/assets/images/icon/centos.svg" width="16" height="16" style="vertical-align: -0.1em"></a> CentOS | centos / centos-stream / centos-altarch / centos-vault |
 | 
					        | <a href="https://www.centos.org" target="_blank"><img src="/assets/images/icon/centos.svg" width="16" height="16" style="vertical-align: -0.1em"></a> CentOS | centos / centos-stream / centos-altarch / centos-vault |
 | 
				
			||||||
        | <a href="https://rockylinux.org" target="_blank"><img src="/assets/images/icon/rocky-linux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> Rocky Linux | rocky |
 | 
					        | <a href="https://rockylinux.org" target="_blank"><img src="/assets/images/icon/rocky-linux.svg" width="16" height="16" style="vertical-align: -0.25em"></a> Rocky Linux | rocky |
 | 
				
			||||||
        | <a href="https://almalinux.org/zh-hans" target="_blank"><img src="/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.15em"></a> AlmaLinux | almalinux / almalinux-vault |
 | 
					        | <a href="https://almalinux.org/zh-hans" target="_blank"><img src="/assets/images/icon/almalinux.svg" width="16" height="16" style="vertical-align: -0.15em"></a> AlmaLinux | almalinux / almalinux-vault |
 | 
				
			||||||
        | <a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖) | opencloudos |
 | 
					 | 
				
			||||||
        | <a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉) | openeuler |
 | 
					        | <a href="https://www.openeuler.org/zh" target="_blank"><img src="/assets/images/icon/openeuler.ico" width="16" height="16" style="vertical-align: -0.2em"></a> openEuler(开源欧拉) | openeuler |
 | 
				
			||||||
 | 
					        | <a href="https://www.opencloudos.org" target="_blank"><img src="/assets/images/icon/opencloudos.png" width="16" height="16" style="vertical-align: -0.25em"></a> OpenCloudOS(鸥栖) | opencloudos |
 | 
				
			||||||
        | <a href="https://www.openkylin.top" target="_blank"><img src="/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟) | openkylin |
 | 
					        | <a href="https://www.openkylin.top" target="_blank"><img src="/assets/images/icon/openkylin.ico" width="16" height="16" style="vertical-align: -0.25em"></a> openKylin(开放麒麟) | openkylin |
 | 
				
			||||||
        | <a href="https://openanolis.cn" target="_blank"><img src="/assets/images/icon/anolis.png" width="16" height="16" style="vertical-align: -0.1em"></a> Anolis OS(龙蜥) | anolis |
 | 
					        | <a href="https://openanolis.cn" target="_blank"><img src="/assets/images/icon/anolis.png" width="16" height="16" style="vertical-align: -0.1em"></a> Anolis OS(龙蜥) | anolis |
 | 
				
			||||||
        | <a href="https://www.opensuse.org" target="_blank"><img src="/assets/images/icon/opensuse.svg" width="16" height="16"></a> openSUSE | opensuse |
 | 
					        | <a href="https://www.opensuse.org" target="_blank"><img src="/assets/images/icon/opensuse.svg" width="16" height="16"></a> openSUSE | opensuse |
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user