Optimise the code to improve speed.

Former-commit-id: 78171273bdd2c27cc085c3bf8b90f9bffd8d0264
This commit is contained in:
fscarmen
2023-02-25 08:09:27 +00:00
parent 4b6a8783b4
commit a8d7699ec8
2 changed files with 230 additions and 205 deletions
+137 -116
View File
@@ -269,8 +269,8 @@ E[128]=""
C[128]=""
E[129]="The current Teams account is unavailable, automatically switch back to the free account"
C[129]="当前 Teams 账户不可用,自动切换回免费账户"
E[130]="Please confirm\\\n Private key\\\t: \$PRIVATEKEY \$MATCH1\\\n Public key\\\t: \$PUBLICKEY \$MATCH2\\\n Address IPv4\\\t: \$ADDRESS4/32 \$MATCH3\\\n Address IPv6\\\t: \$ADDRESS6/128 \$MATCH4"
C[130]="请确认Teams 信息\\\n Private key\\\t: \$PRIVATEKEY \$MATCH1\\\n Public key\\\t: \$PUBLICKEY \$MATCH2\\\n Address IPv4\\\t: \$ADDRESS4/32 \$MATCH3\\\n Address IPv6\\\t: \$ADDRESS6/128 \$MATCH4"
E[130]="Please confirm\\\n Private key\\\t: \$PRIVATEKEY \${MATCH[1]}\\\n Address IPv6\\\t: \$ADDRESS6/128 \${MATCH[2]}"
C[130]="请确认Teams 信息\\\n Private key\\\t: \$PRIVATEKEY \${MATCH[1]}\\\n Address IPv6\\\t: \$ADDRESS6/128 \${MATCH[2]}"
E[131]="comfirm please enter [y] , and other keys to use free account:"
C[131]="确认请按 [y],其他按键则使用免费账户:"
E[132]="Is there a WARP+ or Teams account?\n 1. Use free account (default)\n 2. WARP+\n 3. Teams"
@@ -867,7 +867,8 @@ net() {
if [[ "$i" = "$j" ]]; then
if [ "$CHOOSE_TYPE" = 3 ]; then
unset CHOOSE_TYPE && i=0 && info " $(text 129) "
mv -f /etc/wireguard/wgcf.conf.bak /etc/wireguard/wgcf.conf
[ -e /etc/wireguard/wgcf.conf.bak ] && mv -f /etc/wireguard/wgcf.conf.bak /etc/wireguard/wgcf.conf
[ -e /etc/wireguard/proxy.conf.bak ] && mv -f /etc/wireguard/proxy.conf.bak /etc/wireguard/proxy.conf
rm -f /etc/wireguard/info-temp.log
else
wg-quick down wgcf >/dev/null 2>&1
@@ -978,8 +979,8 @@ stack_switch() {
[[ "$CLIENT" = [35] && "$SWITCHCHOOSE" = [4D] ]] && error " $(text 109) "
check_stack
if [[ "$CHOOSE1" = [12] ]]; then
TO=$(eval echo "\${TO$CHOOSE1[m]}")
if [[ "$MENU_CHOOSE" = [12] ]]; then
TO=$(eval echo "\${TO$MENU_CHOOSE[m]}")
elif [[ "$SWITCHCHOOSE" = [46D] ]]; then
[[ "$T4@$T6@$SWITCHCHOOSE" =~ '1@0@4'|'0@1@6'|'1@1@D' ]] && error " $(text 146) " || TO="$T4$T6$SWITCHCHOOSE"
fi
@@ -1071,13 +1072,16 @@ rule_del() {
# 替换为 Teams 账户信息
teams_change() {
sed -i "s#PrivateKey.*#PrivateKey = $PRIVATEKEY#g;s#Address.*32#Address = ${ADDRESS4}/32#g;s#Address.*128#Address = ${ADDRESS6}/128#g;s#PublicKey.*#PublicKey = $PUBLICKEY#g" /etc/wireguard/wgcf.conf
[ -e /etc/wireguard/proxy.conf ] && cp -f /etc/wireguard/proxy.conf{,.bak}
[ -e /etc/wireguard/wgcf.conf ] && cp -f /etc/wireguard/wgcf.conf{,.bak}
echo "$TEAMS" > /etc/wireguard/info-temp.log
sed -i "s#PrivateKey.*#PrivateKey = $PRIVATEKEY#g; s#Address.*128#Address = ${ADDRESS6}/128#g" /etc/wireguard/wgcf.conf
case $IPV4$IPV6 in
01 ) sed -i "s#Endpoint.*#Endpoint = $(expr "$TEAMS" : '.*v6":"\(.*]\):.*'):2408#g" /etc/wireguard/wgcf.conf ;;
10 ) sed -i "s#Endpoint.*#Endpoint = $(expr "$TEAMS" : '.*v4":"\(.*\):0",.*'):2408#g" /etc/wireguard/wgcf.conf ;;
01 ) sed -i "s#Endpoint.*#Endpoint = $(expr "$TEAMS" : '.*v6":"\(.*]:[0-9]\+\).*')#g" /etc/wireguard/wgcf.conf ;;
10 ) sed -i "s#Endpoint.*#Endpoint = $(expr "$TEAMS" : '.*v4":"\([0-9.]\+:[0-9]\+\).*')#g" /etc/wireguard/wgcf.conf ;;
esac
}
# 输入 WARP+ 账户(如有),限制位数为空或者26位以防输入错误
input_license() {
[ -z "$LICENSE" ] && reading " $(text 28) " LICENSE
@@ -1095,16 +1099,13 @@ input_license() {
# 输入 Teams 账户 URL(如有)
input_url() {
[ -z "$URL" ] && reading " $(text 127) " URL
URL=${URL:-'https://gist.githubusercontent.com/fscarmen/56aaf02d743551737c9973b8be7a3496/raw/61bf63e68e4e91152545679b8f11c72cac215128/2021.12.21'}
URL=${URL:-'https://gist.githubusercontents.com/fscarmen/56aaf02d743551737c9973b8be7a3496/raw/61bf63e68e4e91152545679b8f11c72cac215128/2021.12.21'}
TEAMS=$(curl -sSL "$URL" | sed "s/\"/\"/g")
PRIVATEKEY=$(expr "$TEAMS" : '.*private_key&quot;>\([^<]*\).*')
PUBLICKEY=$(expr "$TEAMS" : '.*public_key&quot;:&quot;\([^&]*\).*')
ADDRESS4=$(expr "$TEAMS" : '.*v4&quot;:&quot;\(172[^&]*\).*')
ADDRESS6=$(expr "$TEAMS" : '.*v6&quot;:&quot;\([^[&]*\).*')
[[ "$PRIVATEKEY" =~ ^[A-Z0-9a-z/+]{43}=$ ]] && MATCH1=$(text 135) || MATCH1=$(text 136)
[[ "$PUBLICKEY" =~ ^[A-Z0-9a-z/+]{43}=$ ]] && MATCH2=$(text 135) || MATCH2=$(text 136)
[[ "$ADDRESS4" =~ ^172.16.[01].[0-9]{1,3}$ ]] && MATCH3=$(text 135) || MATCH3=$(text 136)
[[ "$ADDRESS6" =~ ^fd01(:[0-9a-f]{0,4}){7}$ ]] && MATCH4=$(text 135) || MATCH4=$(text 136)
[[ "$PRIVATEKEY" =~ ^[A-Z0-9a-z/+]{43}=$ ]] && MATCH[1]=$(text 135) || MATCH[1]=$(text 136)
[[ "$ADDRESS6" =~ ^fd01(:[0-9a-f]{0,4}){7}$ ]] && MATCH[2]=$(text 135) || MATCH[2]=$(text 136)
hint "\n $(text_eval 130) \n" && reading " $(text 131) " CONFIRM
}
@@ -1405,71 +1406,72 @@ install() {
# 根据系统选择需要安装的依赖
info "\n $(text 32) \n"
Debian() {
# 添加 backports 源,之后才能安装 wireguard-tools
if [[ $(echo $SYS | sed "s/[^0-9.]//g" | cut -d. -f1) = 9 ]]; then
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
echo -e "Package: *\nPin: release a=unstable\nPin-Priority: 150\n" > /etc/apt/preferences.d/limit-unstable
else
echo "deb http://deb.debian.org/debian $(cat /etc/os-release | grep -i VERSION_CODENAME | sed s/.*=//g)-backports main" > /etc/apt/sources.list.d/backports.list
fi
# 更新源
${PACKAGE_UPDATE[int]}
case "$SYSTEM" in
Debian )
# 添加 backports 源,之后才能安装 wireguard-tools
if [[ $(echo $SYS | sed "s/[^0-9.]//g" | cut -d. -f1) = 9 ]]; then
echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable-wireguard.list
echo -e "Package: *\nPin: release a=unstable\nPin-Priority: 150\n" > /etc/apt/preferences.d/limit-unstable
else
echo "deb http://deb.debian.org/debian $(cat /etc/os-release | grep -i VERSION_CODENAME | sed s/.*=//g)-backports main" > /etc/apt/sources.list.d/backports.list
fi
# 更新源
${PACKAGE_UPDATE[int]}
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} --no-install-recommends net-tools openresolv dnsutils iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-tools
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} --no-install-recommends net-tools openresolv dnsutils iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-tools
# 如 Linux 版本低于5.6并且是 kvm,则安装 wireguard 内核模块
[ "$WG" = 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends linux-headers-"$(uname -r)" && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-dkms
}
# 如 Linux 版本低于5.6并且是 kvm,则安装 wireguard 内核模块
[ "$WG" = 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends linux-headers-"$(uname -r)" && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-dkms
;;
Ubuntu() {
# 更新源
${PACKAGE_UPDATE[int]}
Ubuntu )
# 更新源
${PACKAGE_UPDATE[int]}
# 安装一些必要的网络工具包和 wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} --no-install-recommends net-tools openresolv dnsutils iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-tools
}
# 安装一些必要的网络工具包和 wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} --no-install-recommends net-tools openresolv dnsutils iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} --no-install-recommends wireguard-tools
;;
CentOS() {
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
[ "$COMPANY" = amazon ] && ${PACKAGE_UPDATE[int]} && amazon-linux-extras install -y epel
${PACKAGE_INSTALL[int]} epel-release
${PACKAGE_INSTALL[int]} net-tools iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
CentOS )
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
[ "$COMPANY" = amazon ] && ${PACKAGE_UPDATE[int]} && amazon-linux-extras install -y epel
${PACKAGE_INSTALL[int]} epel-release
${PACKAGE_INSTALL[int]} net-tools iptables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
# 如 Linux 版本低于5.6并且是 kvm,则安装 wireguard 内核模块
VERSION_ID=$(expr "$SYS" : '.*\s\([0-9]\{1,\}\)\.*')
[ "$ARCHITECTURE" != s390x ] && [ "$WG" = 1 ] && curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-"$VERSION_ID"/jdoss-wireguard-epel-"$VERSION_ID".repo &&
# 如 Linux 版本低于5.6并且是 kvm,则安装 wireguard 内核模块
VERSION_ID=$(expr "$SYS" : '.*\s\([0-9]\{1,\}\)\.*')
[ "$ARCHITECTURE" != s390x ] && [ "$WG" = 1 ] && curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-"$VERSION_ID"/jdoss-wireguard-epel-"$VERSION_ID".repo &&
${PACKAGE_INSTALL[int]} wireguard-dkms
${PACKAGE_INSTALL[int]} wireguard-dkms
# 升级所有包同时也升级软件和系统内核
${PACKAGE_UPDATE[int]}
# 升级所有包同时也升级软件和系统内核
${PACKAGE_UPDATE[int]}
# s390x wireguard-tools 安装
[ "$ARCHITECTURE" = s390x ] && [ ! $(type -p wg) ] && rpm -i https://mirrors.cloud.tencent.com/epel/8/Everything/s390x/Packages/w/wireguard-tools-1.0.20210914-1.el8.s390x.rpm
# s390x wireguard-tools 安装
[ "$ARCHITECTURE" = s390x ] && [ ! $(type -p wg) ] && rpm -i https://mirrors.cloud.tencent.com/epel/8/Everything/s390x/Packages/w/wireguard-tools-1.0.20210914-1.el8.s390x.rpm
# CentOS Stream 9 需要安装 resolvconf
[[ "$SYSTEM" = CentOS && "$(expr "$SYS" : '.*\s\([0-9]\{1,\}\)\.*')" = 9 ]] && [ ! $(type -p resolvconf) ] &&
wget $CDN -P /usr/sbin https://github.com/fscarmen/warp/releases/download/resolvconf/resolvconf && chmod +x /usr/sbin/resolvconf
}
# CentOS Stream 9 需要安装 resolvconf
[[ "$SYSTEM" = CentOS && "$(expr "$SYS" : '.*\s\([0-9]\{1,\}\)\.*')" = 9 ]] && [ ! $(type -p resolvconf) ] &&
wget $CDN -P /usr/sbin https://github.com/fscarmen/warp/releases/download/resolvconf/resolvconf && chmod +x /usr/sbin/resolvconf
;;
Alpine() {
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} net-tools iproute2 openresolv openrc iptables ip6tables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
}
Alpine )
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} net-tools iproute2 openresolv openrc iptables ip6tables
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
;;
Arch() {
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} openresolv
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
}
Arch )
# 安装一些必要的网络工具包和wireguard-tools (Wire-Guard 配置工具:wg、wg-quick)
${PACKAGE_INSTALL[int]} openresolv
[ "$OCTEEP" != 1 ] && ${PACKAGE_INSTALL[int]} wireguard-tools
;;
$SYSTEM
esac
wait
@@ -1566,7 +1568,7 @@ EOF
# 保存好配置文件, 如有 Teams,改为 Teams 账户信息
mv -f menu.sh /etc/wireguard >/dev/null 2>&1
[[ "$CONFIRM" = [Yy] ]] && teams_change && echo "$TEAMS" > /etc/wireguard/info-temp.log 2>&1
[[ "$CONFIRM" = [Yy] ]] && teams_change
# 创建再次执行的软链接快捷方式,再次运行可以用 warp 指令,设置默认语言
chmod +x /etc/wireguard/menu.sh >/dev/null 2>&1
@@ -1582,14 +1584,10 @@ EOF
hint " $(text 43) \n" && help
else
[ "$ANEMONE" = 1 ] && iptables_solution
[ "$ANEMONE" = 1 ] && ( iptables_solution; systemctl restart dnsmasq >/dev/null 2>&1 )
# 如有 Teams,改为 Teams 账户信息
grep -qiw "y" <<< "$CONFIRM" && teams_change && echo "$TEAMS" > /etc/wireguard/info-temp.log 2>&1
# 设置开机启动
${SYSTEMCTL_ENABLE[int]} >/dev/null 2>&1
[ $(type -p dnsmasq) ] && systemctl restart dnsmasq >/dev/null 2>&1
[[ "$CONFIRM" = [Yy] ]] && teams_change
# Linux 内核低于5.6的,安装 Wireguard-GO。部分较低内核版本的KVM,即使安装了wireguard-dkms, 仍不能正常工作,兜底使用 wireguard-go
if [ "$WG" = 1 ] || [[ $(systemctl is-active wg-quick@wgcf) != active ]] || [[ $(systemctl is-enabled wg-quick@wgcf) != enabled ]]; then
@@ -1599,7 +1597,7 @@ EOF
tar xzf wireguard-go_linux_$ARCHITECTURE.tar.gz -C /usr/bin/ && rm -f wireguard-go_linux_* && chmod +x /usr/bin/wireguard-go
${SYSTEMCTL_ENABLE[int]} >/dev/null 2>&1
fi
# 创建再次执行的软链接快捷方式,再次运行可以用 warp 指令,设置默认语言
mv -f menu.sh /etc/wireguard >/dev/null 2>&1
chmod +x /etc/wireguard/menu.sh >/dev/null 2>&1
@@ -1611,7 +1609,10 @@ EOF
unset IP4 IP6 WAN4 WAN6 COUNTRY4 COUNTRY6 ASNORG4 ASNORG6 TRACE4 TRACE6 PLUS4 PLUS6 WARPSTATUS4 WARPSTATUS6
[ "$COMPANY" = amazon ] && warning " $(text_eval 40) " && reboot || net
result_priority
# 设置开机启动
${SYSTEMCTL_ENABLE[int]} >/dev/null 2>&1
# /etc/wireguard/info-temp.log 存在,说明升级 Teams 成功,移动文件到 /etc/wireguard/info.log
grep -qiw "y" <<< "$CONFIRM" && [ -e /etc/wireguard/info-temp.log ] && mv -f /etc/wireguard/info-temp.log /etc/wireguard/info.log
@@ -1980,8 +1981,6 @@ change_to_teams() {
input_url
grep -q "$PRIVATEKEY" /etc/wireguard/wgcf.conf && KEY_LICENSE='Private key' && error " $(text_eval 31) "
if grep -qiw "y" <<< "$CONFIRM"; then
cp -f /etc/wireguard/wgcf.conf{,.bak}
echo "$TEAMS" > /etc/wireguard/info-temp.log 2>&1
if [ "$UPDATE_ACCOUNT" = wgcf ]; then
wg-quick down wgcf >/dev/null 2>&1
teams_change
@@ -1991,7 +1990,6 @@ change_to_teams() {
else
systemctl stop wireproxy; sleep 2
teams_change
sed -i "s#PrivateKey.*#PrivateKey = $PRIVATEKEY#g" /etc/wireguard/proxy.conf
[ -e /etc/wireguard/info-temp.log ] && mv -f /etc/wireguard/info-temp.log /etc/wireguard/info.log
wireproxy_onoff
@@ -2006,10 +2004,10 @@ update() {
[ ! -e /etc/wireguard/wgcf-account.toml ] && error " $(text 59) "
[ ! -e /etc/wireguard/wgcf.conf ] && error " $(text 60) "
CHANGE_DO0() { [ "$OPTION" != a ] && unset CHOOSE_TYPE && menu || exit; }
CHANGE_DO1() { change_to_free; }
CHANGE_DO2() { change_to_plus; }
CHANGE_DO3() { change_to_teams; }
CHANGE_DO[0]() { [ "$OPTION" != a ] && unset CHOOSE_TYPE && menu || exit; }
CHANGE_DO[1]() { change_to_free; }
CHANGE_DO[2]() { change_to_plus; }
CHANGE_DO[3]() { change_to_teams; }
# 判断现 WGCF 账户类型: free, plus, teams,如果是 plus,查 WARP+ 余额流量
[ -z "$ACCOUNT_TYPE" ] && ACCOUNT_TYPE=free && CHANGE_TYPE=$(text 174) &&
@@ -2024,7 +2022,7 @@ update() {
# 输入必须是数字且少于等于3
if [[ "$CHOOSE_TYPE" = [0-3] ]]; then
CHANGE_DO$CHOOSE_TYPE
CHANGE_DO[$CHOOSE_TYPE]
else
warning " $(text 51) [0-3] " && unset CHOOSE_TYPE && sleep 1 && update
fi
@@ -2045,9 +2043,9 @@ update() {
[ "$ARCHITECTURE" = arm64 ] && error " $(text 101) "
[ -n "$URL" ] && unset CHOOSE_TYPE && warning "\n $(text 9) "
CHANGE_DO0() { menu; }
CHANGE_DO1() { change_to_free; }
CHANGE_DO2() { change_to_plus; }
CHANGE_DO[0]() { menu; }
CHANGE_DO[1]() { change_to_free; }
CHANGE_DO[2]() { change_to_plus; }
# 判断现 WGCF 账户类型: free, plus,如果是 plus,查 WARP+ 余额流量
ACCOUNT_TYPE=free && CHANGE_TYPE=$(text 177)
@@ -2062,7 +2060,7 @@ update() {
# 输入必须是数字且少于等于2
if [[ "$CHOOSE_TYPE" = [0-2] ]]; then
CHANGE_DO$CHOOSE_TYPE
CHANGE_DO[$CHOOSE_TYPE]
else
warning " $(text 51) [0-2] " && unset CHOOSE_TYPE && sleep 1 && update
fi
@@ -2098,36 +2096,59 @@ update() {
# 判断当前 WARP 网络接口及 Client 的运行状态,并对应的给菜单和动作赋值
menu_setting() {
if [[ "$CLIENT" -gt 1 || "$WIREPROXY" -gt 0 ]]; then
[ "$CLIENT" -lt 3 ] && OPTION1="$(text 88)" || OPTION1="$(text 89)"
[ "$WIREPROXY" -lt 2 ] && OPTION2="$(text 163)" || OPTION2="$(text 164)"
OPTION3="$(text 143)"; OPTION4="$(text 78)"
[ "$CLIENT" -lt 3 ] && MENU_OPTION[1]="1. $(text 88)" || MENU_OPTION[1]="1. $(text 89)"
[ "$WIREPROXY" -lt 2 ] && MENU_OPTION[2]="2. $(text 163)" || MENU_OPTION[2]="2. $(text 164)"
MENU_OPTION[3]="3. $(text 143)"
MENU_OPTION[4]="4. $(text 78)"
ACTION1() { proxy_onoff; }; ACTION2() { wireproxy_onoff; }; ACTION3() { change_port; }; ACTION4() { update; };
ACTION[1]() { proxy_onoff; }
ACTION[2]() { wireproxy_onoff; }
ACTION[3]() { change_port; }
ACTION[4]() { update; }
else
check_stack
case "$m" in
[0-2] ) OPTION1="$(text_eval 66)"; OPTION2="$(text_eval 67)"; OPTION3="$(text_eval 68)"
ACTION1() { CONF=${CONF1[n]}; install; }; ACTION2() { CONF=${CONF2[n]}; install; }; ACTION3() { CONF=${CONF3[n]}; install; } ;;
* ) OPTION1="$(text_eval 141)"; OPTION2="$(text_eval 142)"; OPTION3="$(text 78)"
ACTION1() { stack_switch; }; ACTION2() { stack_switch; }; ACTION3() { update; } ;;
[0-2] ) MENU_OPTION[1]="1. $(text_eval 66)"
MENU_OPTION[2]="2. $(text_eval 67)"
MENU_OPTION[3]="3. $(text_eval 68)"
ACTION[1]() { CONF=${CONF1[n]}; install; }
ACTION[2]() { CONF=${CONF2[n]}; install; }
ACTION[3]() { CONF=${CONF3[n]}; install; }
;;
* ) MENU_OPTION[1]="1. $(text_eval 141)"
MENU_OPTION[2]="2. $(text_eval 142)"
MENU_OPTION[3]="3. $(text 78)"
ACTION[1]() { stack_switch; }
ACTION[2]() { stack_switch; }
ACTION[3]() { update; }
;;
esac
fi
[ -e /etc/dnsmasq.d/warp.conf ] && IPTABLE_INSTALLED="$(text 92)"
[ -n "$(wg 2>/dev/null)" ] && OPTION4="$(text 77)" || OPTION4="$(text 71)"
[ -n "$(wg 2>/dev/null)" ] && MENU_OPTION[4]="4. $(text 77)" || MENU_OPTION[4]="4. $(text 71)"
OPTION5="$CLIENT_INSTALLED$AMD64_ONLY$(text 82)"; OPTION6="$(text 123)"; OPTION7="$(text 72)"; OPTION8="$(text 74)"; OPTION9="$(text 73)"; OPTION10="$(text 75)";
OPTION11="$(text 80)"; OPTION12="$IPTABLE_INSTALLED$(text 138)"; OPTION13="$WIREPROXY_INSTALLED$(text 148)"; OPTION14="$CLIENT_INSTALLED$AMD64_ONLY$(text 168)"; OPTION0="$(text 76)"
MENU_OPTION[5]="5. $CLIENT_INSTALLED$AMD64_ONLY$(text 82)"
MENU_OPTION[6]="6. $(text 123)"
MENU_OPTION[7]="7. $(text 72)"
MENU_OPTION[8]="8. $(text 74)"
MENU_OPTION[9]="9. $(text 73)"
MENU_OPTION[10]="10. $(text 75)"
MENU_OPTION[11]="11. $(text 80)"
MENU_OPTION[12]="12. $IPTABLE_INSTALLED$(text 138)"
MENU_OPTION[13]="13. $WIREPROXY_INSTALLED$(text 148)"
MENU_OPTION[14]="14. $CLIENT_INSTALLED$AMD64_ONLY$(text 168)"
MENU_OPTION[0]="0. $(text 76)"
ACTION4() { OPTION=o; onoff; }
ACTION5() { proxy; }; ACTION6() { change_ip; }; ACTION7() { uninstall; }; ACTION8() { plus; }; ACTION9() { bbrInstall; }; ACTION10() { ver; };
ACTION11() { bash <(curl -sSL https://raw.githubusercontent.com/fscarmen/warp_unlock/main/unlock.sh) -$L; };
ACTION12() { ANEMONE=1 ;install; };
ACTION13() { OCTEEP=1; install; };
ACTION14() { LUBAN=1; proxy; };
ACTION0() { exit; }
ACTION[4]() { OPTION=o; onoff; }
ACTION[5]() { proxy; }; ACTION[6]() { change_ip; }; ACTION[7]() { uninstall; }; ACTION[8]() { plus; }; ACTION[9]() { bbrInstall; }; ACTION[10]() { ver; };
ACTION[11]() { bash <(curl -sSL https://raw.githubusercontent.com/fscarmen/warp_unlock/main/unlock.sh) -$L; };
ACTION[12]() { ANEMONE=1 ;install; };
ACTION[13]() { OCTEEP=1; install; };
ACTION[14]() { LUBAN=1; proxy; };
ACTION[0]() { exit; }
[ -e /etc/wireguard/info.log ] && TYPE=' Teams' && grep -sq 'Device name' /etc/wireguard/info.log 2>/dev/null && check_quota && TYPE='+' && PLUSINFO="$(text 25): $(grep 'Device name' /etc/wireguard/info.log 2>/dev/null | awk '{ print $NF }')\t $(text 63): $QUOTA"
}
@@ -2137,7 +2158,7 @@ menu() {
clear
hint " $(text 16) "
echo -e "======================================================================================================================\n"
info " $(text 17):$VERSION\t $(text 18):$(text 1)\n $(text 19):\n\t $(text 20):$SYS\n\t $(text 21):$(uname -r)\n\t $(text 22):$ARCHITECTURE\n\t $(text 23):$VIRT "
info " $(text 17):$VERSION\n $(text 18):$(text 1)\n $(text 19):\n\t $(text 20):$SYS\n\t $(text 21):$(uname -r)\n\t $(text 22):$ARCHITECTURE\n\t $(text 23):$VIRT "
info "\t IPv4: $WAN4 $WARPSTATUS4 $COUNTRY4 $ASNORG4 "
info "\t IPv6: $WAN6 $WARPSTATUS6 $COUNTRY6 $ASNORG6 "
case "$TRACE4$TRACE6" in
@@ -2158,15 +2179,15 @@ menu() {
esac
grep -q '+' <<< $AC$AC2 && info "\t $(text 63): $QUOTA "
echo -e "\n======================================================================================================================\n"
hint " 1. $OPTION1\n 2. $OPTION2\n 3. $OPTION3\n 4. $OPTION4\n 5. $OPTION5\n 6. $OPTION6\n 7. $OPTION7\n 8. $OPTION8\n 9. $OPTION9 \n 10. $OPTION10\n 11. $OPTION11\n 12. $OPTION12\n 13. $OPTION13\n 14. $OPTION14\n 0. $OPTION0\n "
reading " $(text 50) " CHOOSE1
for ((h=1; h<${#MENU_OPTION[*]}; h++)); do hint " ${MENU_OPTION[h]} "; done
hint " ${MENU_OPTION[0]} "
reading "\n $(text 50) " MENU_CHOOSE
# 输入必须是数字且少于等于最大可选项
MAX_CHOOSE=14
if grep -qE "^[0-9]{1,2}$" <<< $CHOOSE1 && [ "$CHOOSE1" -le "$MAX_CHOOSE" ]; then
ACTION$CHOOSE1
if [[ $MENU_CHOOSE =~ ^[0-9]{1,2}$ ]] && (( $MENU_CHOOSE >= 0 && $MENU_CHOOSE < ${#MENU_OPTION[*]} )); then
ACTION[$MENU_CHOOSE]
else
warning " $(text 51) [0-$MAX_CHOOSE] " && sleep 1 && menu
warning " $(text 51) [0-$((${#MENU_OPTION[*]}-1))] " && sleep 1 && menu
fi
}
+93 -89
View File
@@ -12,6 +12,8 @@ IP_API=https://api.ip.sb/geoip; ISP=isp
# 判断 Teams token 最少字符数
TOKEN_LENGTH=800
trap "rm -f /tmp/warp-go*; exit 1" INT
E[0]="Language:\n 1.English (default) \n 2.简体中文"
C[0]="${E[0]}"
E[1]="Support OpenWrt sysgtem."
@@ -78,8 +80,8 @@ E[31]="Switch \${WARP_BEFORE[m]} to \${WARP_AFTER1[m]}"
C[31]="\${WARP_BEFORE[m]} 转为 \${WARP_AFTER1[m]}"
E[32]="Switch \${WARP_BEFORE[m]} to \${WARP_AFTER2[m]}"
C[32]="\${WARP_BEFORE[m]} 转为 \${WARP_AFTER2[m]}"
E[33]="WARP network interface can be switched as follows:\\\n 1. \$OPTION1\\\n 2. \$OPTION2\\\n 0. Exit script"
C[33]="WARP 网络接口可以切换为以下方式:\\\n 1. \$OPTION1\\\n 2. \$OPTION2\\\n 0. 退出脚本"
E[33]="WARP network interface can be switched as follows:\\\n 1. \${OPTION[1]}\\\n 2. \${OPTION[2]}\\\n 0. Exit script"
C[33]="WARP 网络接口可以切换为以下方式:\\\n 1. \${OPTION[1]}\\\n 2. \${OPTION[2]}\\\n 0. 退出脚本"
E[34]="Please enter the correct number"
C[34]="请输入正确数字"
E[35]="Checking VPS infomation..."
@@ -127,7 +129,7 @@ C[55]="请选择优先级别:\n 1. IPv4\n 2. IPv6\n 3. 使用 VPS 初始设
E[56]="Download warp-go zip file unsuccessful. Script exits. Feedback: [https://github.com/fscarmen/warp/issues]"
C[56]="下载 warp-go 压缩文件不成功,脚本退出,问题反馈: [https://github.com/fscarmen/warp/issues]"
E[57]="Warp-go file does not exist, script exits. Feedback: [https://github.com/fscarmen/warp/issues]"
C[57]="warp-go 文件不存在,脚本退出,问题反馈: [https://github.com/fscarmen/warp/issues]"
C[57]="Warp-go 文件不存在,脚本退出,问题反馈: [https://github.com/fscarmen/warp/issues]"
E[58]="Maximum \${j} attempts to registe WARP\${k} account..."
C[58]="注册 WARP\${k} 账户中, 最大尝试\${j}次……"
E[59]="Try \${i}"
@@ -221,7 +223,7 @@ C[102]="OpenWrt 系统的 WAN 接口的网络传输协议必须为 [静态地址
# 自定义字体彩色,read 函数,友道翻译函数
warning() { echo -e "\033[31m\033[01m$*\033[0m"; }
error() { echo -e "\033[31m\033[01m$*\033[0m" && exit 1; }
error() { echo -e "\033[31m\033[01m$*\033[0m"; rm -f /tmp/warp-go*; exit 1; }
info() { echo -e "\033[32m\033[01m$*\033[0m"; }
hint() { echo -e "\033[33m\033[01m$*\033[0m"; }
reading() { read -rp "$(info "$1")" "$2"; }
@@ -255,15 +257,6 @@ check_root_virt() {
[ -z "$VIRT" ] && VIRT=$(hostnamectl 2>/dev/null | tr 'A-Z' 'a-z' | grep virtualization | sed "s/.*://g")
}
# 检测 warp-go 的安装状态。 0-未安装; 1-已安装未启动; 2-已安装启动中; 3-脚本安装中
check_install() {
if [ -e /opt/warp-go/warp.conf ]; then
[[ "$(ip a)" =~ ": WARP:" ]] && STATUS=2 || STATUS=1
else
STATUS=0
fi
}
# 多方式判断操作系统,试到有值为止。只支持 Debian 9/10/11、Ubuntu 18.04/20.04/22.04 或 CentOS 7/8 ,如非上述操作系统,退出脚本
check_operating_system() {
CMD=( "$(grep -i pretty_name /etc/os-release 2>/dev/null | cut -d \" -f2)"
@@ -306,11 +299,28 @@ check_operating_system() {
[[ "$(echo "$SYS" | sed "s/[^0-9.]//g" | cut -d. -f1)" -lt "${MAJOR[int]}" ]] && error " $(text_eval 7) "
}
check_arch() {
# 判断处理器架构
case $(uname -m) in
aarch64 ) ARCHITECTURE=arm64 ;;
x86) ARCHITECTURE=386 ;;
x86_64 ) CPU_FLAGS=$(cat /proc/cpuinfo | grep flags | head -n 1 | cut -d: -f2)
case "$CPU_FLAGS" in
*avx512* ) ARCHITECTURE=amd64v4 ;;
*avx2* ) ARCHITECTURE=amd64v3 ;;
*sse3* ) ARCHITECTURE=amd64v2 ;;
* ) ARCHITECTURE=amd64 ;;
esac ;;
s390x ) ARCHITECTURE=s390x ;;
* ) error " $(text_eval 37) " ;;
esac
}
# 安装系统依赖及定义 ping 指令
check_dependencies() {
# 对于 Alpine 和 OpenWrt 系统,升级库并重新安装依赖
if echo "$SYSTEM" | grep -qE "Alpine|OpenWrt"; then
[ ! -e /opt/warp-go/warp-go ] && ( ${PACKAGE_UPDATE[int]}; ${PACKAGE_INSTALL[int]} curl wget grep bash )
[ ! -e /opt/warp-go/warp-go ] && ( ${PACKAGE_UPDATE[int]}; ${PACKAGE_INSTALL[int]} curl wget grep bash tar )
else
DEPS_CHECK=("ping" "wget" "curl" "systemctl" "ip")
DEPS_INSTALL=(" iputils-ping" " wget" " curl" " systemctl" " iproute2")
@@ -326,6 +336,24 @@ check_dependencies() {
PING6='ping -6' && [ $(type -p ping6) ] && PING6='ping6'
}
# 检测 warp-go 的安装状态。 0-未安装; 1-已安装未启动; 2-已安装启动中; 3-脚本安装中
check_install() {
if [ -e /opt/warp-go/warp.conf ]; then
[[ "$(ip a)" =~ ": WARP:" ]] && STATUS=2 || STATUS=1
else
STATUS=0
{
# 预下载 warp-go,使用 githubusercontents 的 CDN,以更好的支持双栈。并添加执行权限,如因 gitlab 接口问题未能获取,默认 v1.0.6
latest=$(wget -qO- -T1 -t1 https://gitlab.com/api/v4/projects/ProjectWARP%2Fwarp-go/releases | awk -F '"' '{for (i=0; i<NF; i++) if ($i=="tag_name") {print $(i+2); exit}}' | sed "s/v//")
latest=${latest:-'1.0.6'}
wget --no-check-certificate -qO /tmp/warp-go.tar.gz https://raw.githubusercontents.com/fscarmen/warp/main/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz
tar xzf /tmp/warp-go.tar.gz -C /tmp/ warp-go
chmod +x /tmp/warp-go
rm -f /tmp/warp-go.tar.gz
}&
fi
}
# 检测 IPv4 IPv6 信息,WARP Ineterface 开启,普通还是 Plus账户 和 IP 信息
ip4_info() {
unset IP4 COUNTRY4 ASNORG4 TRACE4 PLUS4 WARPSTATUS4
@@ -490,7 +518,7 @@ uninstall() {
systemctl disable --now warp-go >/dev/null 2>&1
kill -15 $(pgrep warp-go) >/dev/null 2>&1
/opt/warp-go/warp-go --config=/opt/warp-go/warp.conf --remove >/dev/null 2>&1
rm -rf /opt/warp-go /lib/systemd/system/warp-go.service /usr/bin/warp-go
rm -rf /opt/warp-go /lib/systemd/system/warp-go.service /usr/bin/warp-go /tmp/warp-go*
[ -e /opt/warp-go/tun.sh ] && rm -f /opt/warp-go/tun.sh && sed -i '/tun.sh/d' /etc/crontab
# 显示卸载结果
@@ -631,7 +659,7 @@ stack_switch() {
[[ "$T4@$T6@$SWITCHCHOOSE" =~ '1@0@4'|'0@1@6'|'1@1@D' ]] && error " $(text 30) " || TO="$T4$T6$SWITCHCHOOSE"
fi
else
OPTION1="$(text_eval 31)"; OPTION2="$(text_eval 32)"
STACK_OPTION[1]="$(text_eval 31)"; STACK_OPTION[2]="$(text_eval 32)"
hint "\n $(text_eval 33) \n" && reading " $(text 4) " SWITCHTO
case "$SWITCHTO" in
1 ) TO=${TO1[m]};;
@@ -721,21 +749,6 @@ EOF
[[ "$L" = C && -n "$COUNTRY4" ]] && COUNTRY4=$(translate "$COUNTRY4")
[[ "$L" = C && -n "$COUNTRY6" ]] && COUNTRY6=$(translate "$COUNTRY6")
# 判断处理器架构
case $(uname -m) in
aarch64 ) ARCHITECTURE=arm64 ;;
x86) ARCHITECTURE=386 ;;
x86_64 ) CPU_FLAGS=$(cat /proc/cpuinfo | grep flags | head -n 1 | cut -d: -f2)
case "$CPU_FLAGS" in
*avx512* ) ARCHITECTURE=amd64v4 ;;
*avx2* ) ARCHITECTURE=amd64v3 ;;
*sse3* ) ARCHITECTURE=amd64v2 ;;
* ) ARCHITECTURE=amd64 ;;
esac ;;
s390x ) ARCHITECTURE=s390x ;;
* ) error " $(text_eval 37) " ;;
esac
# 判断当前 IPv4 与 IPv6 IP归属
[ "$STATUS" = 2 ] && grep -qE "^AllowedIPs[ ]+=.*0\.\0\/0|#AllowedIPs" /opt/warp-go/warp.conf && INTERFACE='--interface WARP'
[ "$IPV4" = 1 ] && ip4_info
@@ -899,20 +912,11 @@ install() {
start=$(date +%s)
# 注册 WARP 账户 (将生成 warp 文件保存账户信息)
# 判断 warp-go 的最新版本,如因 gitlab 接口问题未能获取,默认 v1.0.6
{
latest=$(wget -qO- -T1 -t1 https://gitlab.com/api/v4/projects/ProjectWARP%2Fwarp-go/releases | awk -F '"' '{for (i=0; i<NF; i++) if ($i=="tag_name") {print $(i+2); exit}}' | sed "s/v//")
latest=${latest:-'1.0.6'}
# 安装 warp-go,尽量下载官方的最新版本,如官方 warp-go 下载不成功,将使用 githubusercontents 的 CDN,以更好的支持双栈。并添加执行权限
{
mkdir -p /opt/warp-go/ >/dev/null 2>&1
wget -T20 -t1 --no-check-certificate $CDN -O /opt/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz https://gitlab.com/ProjectWARP/warp-go/-/releases/v"$latest"/downloads/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz ||
wget -T20 -t2 --no-check-certificate $CDN -O /opt/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz https://raw.githubusercontents.com/fscarmen/warp/main/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz
[ ! -e /opt/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz ] && error "$(text 56)"
[ $(type -p tar) ] || ${PACKAGE_INSTALL[int]} tar 2>/dev/null || ( ${PACKAGE_UPDATE[int]}; ${PACKAGE_INSTALL[int]} tar 2>/dev/null )
tar xzf /opt/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz -C /opt/warp-go/ warp-go
[ ! -e /opt/warp-go/warp-go ] && error "$(text 57)" || chmod +x /opt/warp-go/warp-go
rm -f /opt/warp-go/warp-go_"$latest"_linux_"$ARCHITECTURE".tar.gz
wait
[ ! -e /tmp/warp-go ] && error "$(text 56)" || mv -f /tmp/warp-go /opt/warp-go/
[ ! -e /opt/warp-go/warp-go ] && error "$(text 57)"
# 注册用户自定义 token 的 Teams 账户
if [ "$LICENSETYPE" = 2 ]; then
@@ -1102,48 +1106,48 @@ check_quota() {
# 判断当前 WARP 网络接口及 Client 的运行状态,并对应的给菜单和动作赋值
menu_setting() {
if [ "$STATUS" = 0 ]; then
OPTION1="$(text_eval 64)"
OPTION2="$(text_eval 65)"
OPTION3="$(text_eval 66)"
OPTION4="$(text_eval 67)"
OPTION5="$(text_eval 68)"
OPTION6="$(text_eval 69)"
OPTION7="$(text_eval 70)"
OPTION8="$(text_eval 71)"
ACTION1() { CONF=${CONF1[n]}; PRIORITY=1; install; }
ACTION2() { CONF=${CONF1[n]}; PRIORITY=2; install; }
ACTION3() { CONF=${CONF2[n]}; PRIORITY=1; install; }
ACTION4() { CONF=${CONF2[n]}; PRIORITY=2; install; }
ACTION5() { CONF=${CONF3[n]}; PRIORITY=1; install; }
ACTION6() { CONF=${CONF3[n]}; PRIORITY=2; install; }
ACTION7() { CONF=${CONF3[n]}; PRIORITY=1; WARP_STACK=4; install; }
ACTION8() { CONF=${CONF3[n]}; PRIORITY=2; WARP_STACK=4; install; }
MENU_OPTION[1]="$(text_eval 64)"
MENU_OPTION[2]="$(text_eval 65)"
MENU_OPTION[3]="$(text_eval 66)"
MENU_OPTION[4]="$(text_eval 67)"
MENU_OPTION[5]="$(text_eval 68)"
MENU_OPTION[6]="$(text_eval 69)"
MENU_OPTION[7]="$(text_eval 70)"
MENU_OPTION[8]="$(text_eval 71)"
ACTION[1]() { CONF=${CONF1[n]}; PRIORITY=1; install; }
ACTION[2]() { CONF=${CONF1[n]}; PRIORITY=2; install; }
ACTION[3]() { CONF=${CONF2[n]}; PRIORITY=1; install; }
ACTION[4]() { CONF=${CONF2[n]}; PRIORITY=2; install; }
ACTION[5]() { CONF=${CONF3[n]}; PRIORITY=1; install; }
ACTION[6]() { CONF=${CONF3[n]}; PRIORITY=2; install; }
ACTION[7]() { CONF=${CONF3[n]}; PRIORITY=1; WARP_STACK=4; install; }
ACTION[8]() { CONF=${CONF3[n]}; PRIORITY=2; WARP_STACK=4; install; }
else
[ "$NON_GLOBAL" = 1 ] || GLOBAL_AFTER="$(text 24)"
[ "$STATUS" = 2 ] && ON_OFF="$(text 72)" || ON_OFF="$(text 73)"
OPTION1="$(text_eval 74)"
OPTION2="$(text_eval 75)"
OPTION3="$(text_eval 76)"
OPTION4="$ON_OFF"
OPTION5="$(text_eval 77)"
MENU_OPTION[1]="$(text_eval 74)"
MENU_OPTION[2]="$(text_eval 75)"
MENU_OPTION[3]="$(text_eval 76)"
MENU_OPTION[4]="$ON_OFF"
MENU_OPTION[5]="$(text_eval 77)"
OPTION6="$(text 78)"
OPTION7="$(text 79)"
OPTION8="$(text 80)"
ACTION1() { stack_switch; }
ACTION2() { stack_switch; }
ACTION3() { global_switch; }
ACTION4() { OPTION=o; onoff; }
ACTION5() { update; }
ACTION6() { change_ip; }
ACTION7() { export_file; }
ACTION8() { uninstall; }
MENU_OPTION[6]="$(text 78)"
MENU_OPTION[7]="$(text 79)"
MENU_OPTION[8]="$(text 80)"
ACTION[1]() { stack_switch; }
ACTION[2]() { stack_switch; }
ACTION[3]() { global_switch; }
ACTION[4]() { OPTION=o; onoff; }
ACTION[5]() { update; }
ACTION[6]() { change_ip; }
ACTION[7]() { export_file; }
ACTION[8]() { uninstall; }
fi
OPTION0="$(text 81)"
OPTION9="$(text 82) (warp-go v)"
ACTION0() { exit; }
ACTION9() { ver; }
MENU_OPTION[0]="$(text 81)"
MENU_OPTION[9]="$(text 82) (warp-go v)"
ACTION[0]() { rm -f /tmp/warp-go*; exit; }
ACTION[9]() { ver; }
[ -e /opt/warp-go/warp.conf ] && TYPE=$(grep "Type" /opt/warp-go/warp.conf | cut -d= -f2 | sed "s# ##g") &&
[ "$TYPE" = plus ] && check_quota && PLUSINFO="$(text 83): $(cat /opt/warp-go/Device_Name)\t $(text 26): $QUOTA"
@@ -1154,7 +1158,7 @@ menu() {
clear
hint " $(text 3) "
echo -e "======================================================================================================================\n"
info " $(text 84): $VERSION\t $(text 85): $(text 1)\n $(text 86):\n\t $(text 87): $SYS\n\t $(text 88): $(uname -r)\n\t $(text 89): $ARCHITECTURE\n\t $(text 90): $VIRT "
info " $(text 84): $VERSION\n $(text 85): $(text 1)\n $(text 86):\n\t $(text 87): $SYS\n\t $(text 88): $(uname -r)\n\t $(text 89): $ARCHITECTURE\n\t $(text 90): $VIRT "
info "\t IPv4: $WAN4 $WARPSTATUS4 $COUNTRY4 $ASNORG4 "
info "\t IPv6: $WAN6 $WARPSTATUS6 $COUNTRY6 $ASNORG6 "
if [ "$STATUS" = 2 ]; then
@@ -1166,15 +1170,14 @@ menu() {
fi
[ -n "$PLUSINFO" ] && info "\t $PLUSINFO "
echo -e "\n======================================================================================================================\n"
info " 1. $OPTION1\n 2. $OPTION2\n 3. $OPTION3\n 4. $OPTION4\n 5. $OPTION5\n 6. $OPTION6\n 7. $OPTION7\n 8. $OPTION8\n 9. $OPTION9 \n 0. $OPTION0\n "
reading " $(text 4) " CHOOSE
for ((d=1; d<=${#MENU_OPTION[*]}; d++)); do [ "$d" = "${#MENU_OPTION[*]}" ] && d=0 && hint " $d. ${MENU_OPTION[d]} " && break || hint " $d. ${MENU_OPTION[d]} "; done
reading "\n $(text 4) " CHOOSE
# 输入必须是数字且少于等于最大可选项
MAX_CHOOSE=9
if grep -qE "^[0-9]$" <<< "$CHOOSE" && [ "$CHOOSE" -le "$MAX_CHOOSE" ]; then
ACTION$CHOOSE
if [[ "$CHOOSE" =~ ^[0-9]+$ ]] && (( $CHOOSE >= 0 && $CHOOSE < ${#MENU_OPTION[*]} )); then
ACTION[$CHOOSE]
else
warning " $(text 34) [0-$MAX_CHOOSE] " && sleep 1 && menu
warning " $(text 34) [0-$((${#MENU_OPTION[*]}-1))] " && sleep 1 && menu
fi
}
@@ -1197,8 +1200,10 @@ NAME="$3"
# 主程序运行 1/3
statistics_of_run-times
select_language
check_install
check_operating_system
check_arch
check_dependencies
check_install
# 设置部分后缀 1/3
case "$OPTION" in
@@ -1220,7 +1225,6 @@ case "$OPTION" in
esac
# 主程序运行 3/3
check_dependencies
check_system_info
check_global
check_stack