11#! /bin/bash
22# # Author: SuperManito
3- # # Modified: 2025-09-28
3+ # # Modified: 2025-10-09
44# # License: MIT
55# # GitHub: https://github.com/SuperManito/LinuxMirrors
66# # Website: https://linuxmirrors.cn
@@ -22,7 +22,7 @@ mirror_list_docker_ce=(
2222 " 重庆邮电大学@mirrors.cqupt.edu.cn/docker-ce"
2323 " 中国科学技术大学@mirrors.ustc.edu.cn/docker-ce"
2424 " 中国科学院软件研究所@mirror.iscas.ac.cn/docker-ce"
25- " 官方 @download.docker.com"
25+ " 官方源 @download.docker.com"
2626)
2727
2828# # Docker Registry 仓库列表
@@ -657,42 +657,46 @@ function collect_system_info() {
657657function choose_mirrors() {
658658 # # 打印软件源列表
659659 function print_mirrors_list() {
660- local tmp_mirror_name tmp_mirror_url arr_num default_length tmp_length tmp_spaces_nums a i j
661- # # 计算字符串长度
660+ local tmp_name tmp_index i j
662661 function StringLength() {
663662 local text=$1
664663 echo " ${# text} "
665664 }
666- echo -e ' '
667665
668666 local list_arr=()
669667 local list_arr_sum=" $( eval echo \$ {# $1[@]})"
670- for (( a = 0 ; a < $list_arr_sum ; a ++ )) ; do
671- list_arr[$a ]=" $( eval echo \$ {$1 [a ]}) "
668+ for (( i = 0 ; i < $list_arr_sum ; i ++ )) ; do
669+ list_arr[$i ]=" $( eval echo \$ {$1 [i ]}) "
672670 done
671+ local name_width=${2:- " 30" }
673672 if command_exists printf ; then
673+ local tmp_uchar_1 tmp_uchar_2 tmp_uchar_3 tmp_uchar_4 tmp_default_length tmp_length tmp_unicode_length tmp_spaces_nums tmp_max_length
674674 for (( i = 0 ; i < ${# list_arr[@]} ; i++ )) ; do
675- tmp_mirror_name=$( echo " ${list_arr[i]} " | awk -F ' @' ' {print$1}' )
676- # tmp_mirror_url=$(echo "${list_arr[i]}" | awk -F '@' '{print$2}')
677- arr_num=$(( i + 1 ))
678- default_length=${2:- " 30" }
679- [[ $( echo " ${tmp_mirror_name} " | grep -c " “" ) -gt 0 ]] && let default_length+=$( echo " ${tmp_mirror_name} " | grep -c " “" )
680- [[ $( echo " ${tmp_mirror_name} " | grep -c " ”" ) -gt 0 ]] && let default_length+=$( echo " ${tmp_mirror_name} " | grep -c " ”" )
681- [[ $( echo " ${tmp_mirror_name} " | grep -c " ‘" ) -gt 0 ]] && let default_length+=$( echo " ${tmp_mirror_name} " | grep -c " ‘" )
682- [[ $( echo " ${tmp_mirror_name} " | grep -c " ’" ) -gt 0 ]] && let default_length+=$( echo " ${tmp_mirror_name} " | grep -c " ’" )
683- tmp_length=$( StringLength $( echo " ${tmp_mirror_name} " | sed " s| ||g" | sed " s|[0-9a-zA-Z\.\=\:\_\(\)\'\" -\/\!·]||g;" ) )
684- tmp_spaces_nums=$(( $(($default_length - ${tmp_length} - $(StringLength "${tmp_mirror_name} ")) ) / 2))
685- for (( j = 1 ; j <= ${tmp_spaces_nums} ; j++ )) ; do
686- tmp_mirror_name=" ${tmp_mirror_name} "
687- done
688- printf " ❖ %-$(( $default_length + ${tmp_length} )) s %4s\n" " ${tmp_mirror_name} " " $arr_num )"
675+ tmp_name=" $( echo " ${list_arr[i]} " | awk -F ' @' ' {print$1}' ) "
676+ tmp_index=$(( i + 1 ))
677+ tmp_default_length=" ${name_width} "
678+ tmp_uchar_1=$( echo " ${tmp_name} " | grep -c " “" )
679+ tmp_uchar_2=$( echo " ${tmp_name} " | grep -c " ”" )
680+ tmp_uchar_3=$( echo " ${tmp_name} " | grep -c " ‘" )
681+ tmp_uchar_4=$( echo " ${tmp_name} " | grep -c " ’" )
682+ [[ " ${tmp_uchar_1} " -gt 0 ]] && (( tmp_default_length += tmp_uchar_1 ))
683+ [[ " ${tmp_uchar_2} " -gt 0 ]] && (( tmp_default_length += tmp_uchar_2 ))
684+ [[ " ${tmp_uchar_3} " -gt 0 ]] && (( tmp_default_length += tmp_uchar_3 ))
685+ [[ " ${tmp_uchar_4} " -gt 0 ]] && (( tmp_default_length += tmp_uchar_4 ))
686+ tmp_length=$( StringLength " ${tmp_name} " )
687+ tmp_unicode_length=$( StringLength " $( echo " ${tmp_name} " | sed " s|[0-9a-zA-Z -~]||g; s| ||g" ) " )
688+ tmp_max_length=$(( tmp_default_length + tmp_unicode_length))
689+ tmp_spaces_nums=$(( ((tmp_default_length - tmp_unicode_length - tmp_length)) / 2))
690+ if [[ $tmp_spaces_nums -gt 0 ]]; then
691+ tmp_name=" ${tmp_name} $( printf ' %*s' ${tmp_spaces_nums} ' ' ) "
692+ fi
693+ printf " ❖ %-${tmp_max_length} s %4s\n" " ${tmp_name} " " ${tmp_index} )"
689694 done
690695 else
691696 for (( i = 0 ; i < ${# list_arr[@]} ; i++ )) ; do
692- tmp_mirror_name=" ${list_arr[i]%@* } "
693- tmp_mirror_url=" ${list_arr[i]#*@ } "
694- arr_num=$(( i + 1 ))
695- echo -e " ❖ $arr_num . ${tmp_mirror_url} | ${tmp_mirror_name} "
697+ tmp_name=" ${list_arr[i]%@* } "
698+ tmp_index=$(( i + 1 ))
699+ echo -e " ❖ $tmp_index . ${tmp_name} "
696700 done
697701 fi
698702 }
@@ -743,11 +747,11 @@ function choose_mirrors() {
743747 local arch=" ${DEVICE_ARCH} "
744748 local date_time time_zone
745749 date_time=" $( date " +%Y-%m-%d %H:%M" ) "
746- timezone =" $( timedatectl status 2> /dev/null | grep " Time zone" | awk -F ' :' ' {print$2}' | awk -F ' ' ' {print$1}' ) "
750+ time_zone =" $( timedatectl status 2> /dev/null | grep " Time zone" | awk -F ' :' ' {print$2}' | awk -F ' ' ' {print$1}' ) "
747751
748752 echo -e ' '
749753 echo -e " 运行环境 ${BLUE}${system_name} ${arch}${PLAIN} "
750- echo -e " 系统时间 ${BLUE}${date_time} ${timezone }${PLAIN} "
754+ echo -e " 系统时间 ${BLUE}${date_time} ${time_zone }${PLAIN} "
751755 }
752756
753757 [[ " ${PURE_MODE} " != " true" ]] && print_title
@@ -761,10 +765,11 @@ function choose_mirrors() {
761765 SOURCE=" ${_SELECT_RESULT#*@ } "
762766 echo -e " \n${GREEN} ➜${PLAIN} ${BOLD} Docker CE: ${_SELECT_RESULT%@* }${PLAIN} "
763767 else
764- print_mirrors_list " ${mirror_list_name} " 38
765- local CHOICE_B=$( echo -e " \n${BOLD} └─ 请选择并输入你想使用的 Docker CE 源 [ 1-$( eval echo \$ {# $mirror_list_name[@]}) ]:${PLAIN}")
768+ echo ' '
769+ print_mirrors_list " ${mirror_list_name} " 39
770+ local CHOICE_B=" $( echo -e " \n${BOLD} └─ 请选择并输入你想使用的 Docker CE 源 [ 1-$( eval echo \$ {# ${mirror_list_name}[@]}) ]:${PLAIN}")"
766771 while true ; do
767- read -p " ${CHOICE_B} " INPUT
772+ read -rp " ${CHOICE_B} " INPUT
768773 case " ${INPUT} " in
769774 [1-9] | [1-9][0-9] | [1-9][0-9][0-9])
770775 local tmp_source=" $( eval echo \$ {${mirror_list_name} [$(( $INPUT - 1 )) ]}) "
@@ -796,10 +801,11 @@ function choose_mirrors() {
796801 SOURCE_REGISTRY=" ${_SELECT_RESULT#*@ } "
797802 echo -e " \n${GREEN} ➜${PLAIN} ${BOLD} Docker Registry: $( echo " ${_SELECT_RESULT%@* } " | sed ' s|(推荐)||g' ) ${PLAIN} "
798803 else
799- print_mirrors_list " ${mirror_list_name} " 44
800- local CHOICE_C=$( echo -e " \n${BOLD} └─ 请选择并输入你想使用的 Docker Registry 源 [ 1-$( eval echo \$ {# $mirror_list_name[@]}) ]:${PLAIN}")
804+ echo ' '
805+ print_mirrors_list " ${mirror_list_name} " 45
806+ local CHOICE_C=" $( echo -e " \n${BOLD} └─ 请选择并输入你想使用的 Docker Registry 源 [ 1-$( eval echo \$ {# ${mirror_list_name}[@]}) ]:${PLAIN}")"
801807 while true ; do
802- read -p " ${CHOICE_C} " INPUT
808+ read -rp " ${CHOICE_C} " INPUT
803809 case " ${INPUT} " in
804810 [1-9] | [1-9][0-9] | [1-9][0-9][0-9])
805811 local tmp_source=" $( eval echo \$ {${mirror_list_name} [$(( $INPUT - 1 )) ]}) "
@@ -1198,8 +1204,8 @@ function install_docker_engine() {
11981204 echo -e " \n${GREEN} --------- 请选择你要安装的版本,如:28.3.0 ---------- ${PLAIN} \n"
11991205 cat $File_DockerVersionTmp
12001206 while true ; do
1201- local CHOICE=$( echo -e " \n${BOLD} └─ 请根据上面的列表,选择并输入你想要安装的具体版本号:${PLAIN} \n" )
1202- read -p " ${CHOICE} " target_docker_version
1207+ local CHOICE=" $( echo -e " \n${BOLD} └─ 请根据上面的列表,选择并输入你想要安装的具体版本号:${PLAIN} \n" ) "
1208+ read -rp " ${CHOICE} " target_docker_version
12031209 echo ' '
12041210 cat $File_DockerVersionTmp | grep -Eqw " ${target_docker_version} "
12051211 if [ $? -eq 0 ]; then
@@ -1283,7 +1289,7 @@ function install_docker_engine() {
12831289 fi
12841290 else
12851291 local CHOICE_A=" $( echo -e " \n${BOLD} └─ ${ask_text} [Y/n] ${PLAIN} " ) "
1286- read -p " ${CHOICE_A} " INPUT
1292+ read -rp " ${CHOICE_A} " INPUT
12871293 [[ -z " ${INPUT} " ]] && INPUT=Y
12881294 case $INPUT in
12891295 [Yy] | [Yy][Ee][Ss])
@@ -1361,7 +1367,7 @@ function change_docker_registry_mirror() {
13611367 fi
13621368 else
13631369 local CHOICE_BACKUP=" $( echo -e " \n${BOLD} └─ ${ask_text} [Y/n] ${PLAIN} " ) "
1364- read -p " ${CHOICE_BACKUP} " INPUT
1370+ read -rp " ${CHOICE_BACKUP} " INPUT
13651371 [[ -z " ${INPUT} " ]] && INPUT=Y
13661372 case $INPUT in
13671373 [Yy] | [Yy][Ee][Ss]) ;;
@@ -1722,14 +1728,14 @@ function animate_exec() {
17221728 echo " ${line} "
17231729 return
17241730 fi
1725- local non_ascii_count=$( echo " ${line// / } " | sed " s|[0-9a-zA-Z\.\=\:\_\(\)\' \" -\/\!· ]||g;" | wc -m)
1731+ local non_ascii_count=$( echo " ${line} " | sed " s|[0-9a-zA-Z -~ ]||g; s| ||g " | wc -m)
17261732 local total_length=${# line}
17271733 local display_length=$(( total_length + non_ascii_count))
17281734 local quote_count=0
1729- [[ $( echo " ${line} " | grep -c " “" ) -gt 0 ]] && quote_count= $ (( quote_count + $(echo "${line} " | grep - c "“")) )
1730- [[ $( echo " ${line} " | grep -c " ”" ) -gt 0 ]] && quote_count= $ (( quote_count + $(echo "${line} " | grep - c "”")) )
1731- [[ $( echo " ${line} " | grep -c " ‘" ) -gt 0 ]] && quote_count= $ (( quote_count + $(echo "${line} " | grep - c "‘")) )
1732- [[ $( echo " ${line} " | grep -c " ’" ) -gt 0 ]] && quote_count= $ (( quote_count + $(echo "${line} " | grep - c "’")) )
1735+ [[ $( echo " ${line} " | grep -c " “" ) -gt 0 ]] && (( quote_count += " $(echo "${line} " | grep - c "“")" ))
1736+ [[ $( echo " ${line} " | grep -c " ”" ) -gt 0 ]] && (( quote_count += " $(echo "${line} " | grep - c "”")" ))
1737+ [[ $( echo " ${line} " | grep -c " ‘" ) -gt 0 ]] && (( quote_count += " $(echo "${line} " | grep - c "‘")" ))
1738+ [[ $( echo " ${line} " | grep -c " ’" ) -gt 0 ]] && (( quote_count += " $(echo "${line} " | grep - c "’")" ))
17331739 display_length=$(( display_length - quote_count))
17341740 if [[ $display_length -le $display_width ]]; then
17351741 echo " $line "
@@ -1741,7 +1747,7 @@ function animate_exec() {
17411747 while [ $i -lt ${# line} ]; do
17421748 local char=" ${line: $i : 1} "
17431749 local char_width=1
1744- if ! [[ " $char " =~ [0-9a-zA-Z\.\=\:\_\(\)\'\" -\/\! ·] ]]; then
1750+ if ! [[ " $char " =~ [0-9a-zA-Z\.\=\:\_\(\)\'\"\ -\/\!\ · ] ]]; then
17451751 if [[ " $char " != " “" && " $char " != " ”" && " $char " != " ‘" && " $char " != " ’" ]]; then
17461752 char_width=2
17471753 fi
0 commit comments