Merge pull request #1113 from sofia-riese/patch-4

refactor(setproviders): replace recursion with while loop
This commit is contained in:
juewuy
2026-01-11 09:46:17 +08:00
committed by GitHub

View File

@@ -535,176 +535,176 @@ EOF
rm -rf "$TMPDIR"/providers rm -rf "$TMPDIR"/providers
fi fi
} }
setproviders(){ #自定义providers
. "$CRASHDIR"/libs/set_cron.sh # 自定义providers
. "$CRASHDIR"/libs/web_get_bin.sh setproviders() {
#获取模版名称 . "$CRASHDIR"/libs/set_cron.sh
if [ -z "$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg)" ];then . "$CRASHDIR"/libs/web_get_bin.sh
provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') while true; do
else # 获取模版名称
provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}') if [ -z "$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg)" ]; then
provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}') provider_temp_des=$(sed -n "1 p" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}')
[ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file else
fi provider_temp_file=$(grep "provider_temp_${coretype}" "$CRASHDIR"/configs/ShellCrash.cfg | awk -F '=' '{print $2}')
echo "-----------------------------------------------" provider_temp_des=$(grep "$provider_temp_file" "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print $1}')
echo -e "\033[33m你可以在这里快捷管理与生成自定义的providers服务商\033[0m" [ -z "$provider_temp_des" ] && provider_temp_des=$provider_temp_file
echo -e "\033[33m支持在线及本地的Yaml格式配置导入\033[0m" fi
[ -s "$CRASHDIR"/configs/providers.cfg ] && { echo "-----------------------------------------------"
echo "-----------------------------------------------" echo -e "\033[33m你可以在这里快捷管理与生成自定义的providers服务商\033[0m"
echo -e "\033[36m输入对应数字可管理providers服务商\033[0m" echo -e "\033[33m支持在线及本地的Yaml格式配置导入\033[0m"
cat "$CRASHDIR"/configs/providers.cfg | awk -F "#" '{print " "NR" "$1" "$2}' [ -s "$CRASHDIR"/configs/providers.cfg ] && {
} echo "-----------------------------------------------"
echo -e " d \033[31m清空\033[0mproviders服务商列表" echo -e "\033[36m输入对应数字可管理providers服务商\033[0m"
echo -e " e \033[33m清理\033[0mproviders目录文件" cat "$CRASHDIR"/configs/providers.cfg | awk -F "#" '{print " "NR" "$1" "$2}'
echo "-----------------------------------------------" }
echo -e "\033[36m按照a-b-c的顺序即可完成配置生成\033[0m" echo -e " d \033[31m清空\033[0mproviders服务商列表"
echo -e " a \033[36m添加\033[0mproviders服务商/节点" echo -e " e \033[33m清理\033[0mproviders目录文件"
echo -e " b 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m" echo "-----------------------------------------------"
echo -e " c \033[32m生成\033[0m基于providers的配置文件" echo -e "\033[36m按照a-b-c的顺序即可完成配置生成\033[0m"
echo "-----------------------------------------------" echo -e " a \033[36m添加\033[0mproviders服务商/节点"
echo -e " 0 返回上级菜单" echo -e " b 选择\033[33m规则模版\033[0m \033[32m$provider_temp_des\033[0m"
read -p "请输入对应字母或数字 > " num echo -e " c \033[32m生成\033[0m基于providers的配置文件"
case "$num" in echo "-----------------------------------------------"
0) echo -e " 0 返回上级菜单"
;; read -p "请输入对应字母或数字 > " num
[1-9]|[1-9][0-9]) case "$num" in
provider_name=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $1}') "" | 0)
provider_url=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $2}') break
if [ -z "$provider_name" ];then ;;
errornum [1-9] | [1-9][0-9])
else provider_name=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $1}')
echo "-----------------------------------------------" provider_url=$(sed -n "$num p" "$CRASHDIR"/configs/providers.cfg | awk '{print $2}')
echo -e " 1 修改名称:\033[36m$provider_name\033[0m" if [ -z "$provider_name" ]; then
echo -e " 2 修改链接地址:\033[32m$provider_url\033[0m" errornum
echo -e " 3 生成\033[33m仅包含此链接\033[0m的配置文件" else
echo -e " 4 \033[31m移除此链接\033[0m" echo "-----------------------------------------------"
echo "-----------------------------------------------" echo -e " 1 修改名称:\033[36m$provider_name\033[0m"
echo -e " 0 返回上级菜单" echo -e " 2 修改链接地址:\033[32m$provider_url\033[0m"
read -p "请选择需要执行的操作 > " num echo -e " 3 生成\033[33m仅包含此链接\033[0m的配置文件"
case "$num" in echo -e " 4 \033[31m移除此链接\033[0m"
0) echo "-----------------------------------------------"
;; echo -e " 0 返回上级菜单"
1) read -p "请选择需要执行的操作 > " num
read -p "请输入名称或者代号(不可重复,不支持纯数字) > " name case "$num" in
if [ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg;then "" | 0) ;;
sed -i "s|$provider_name $provider_url|$name $provider_url|" "$CRASHDIR"/configs/providers.cfg 1)
else read -p "请输入名称或者代号(不可重复,不支持纯数字) > " name
echo -e "\033[31m输入错误请重新输入\033[0m" if [ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg; then
fi sed -i "s|$provider_name $provider_url|$name $provider_url|" "$CRASHDIR"/configs/providers.cfg
;; else
2) echo -e "\033[31m输入错误请重新输入\033[0m"
read -p "请输入链接地址或本地相对路径 > " link fi
if [ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && [ -z "$(grep "$link" "$CRASHDIR"/configs/providers.cfg)" ];then ;;
link=$(echo $link | sed 's/\&/\\\&/g') #特殊字符添加转义 2)
sed -i "s|$provider_name $provider_url|$provider_name $link|" "$CRASHDIR"/configs/providers.cfg read -p "请输入链接地址或本地相对路径 > " link
else if [ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && [ -z "$(grep "$link" "$CRASHDIR"/configs/providers.cfg)" ]; then
echo -e "\033[31m输入错误请重新输入\033[0m" link=$(echo $link | sed 's/\&/\\\&/g') #特殊字符添加转义
fi sed -i "s|$provider_name $provider_url|$provider_name $link|" "$CRASHDIR"/configs/providers.cfg
;; else
3) echo -e "\033[31m输入错误请重新输入\033[0m"
gen_${coretype}_providers $provider_name $provider_url fi
;; ;;
4) 3)
sed -i "/^$provider_name /d" "$CRASHDIR"/configs/providers.cfg gen_${coretype}_providers $provider_name $provider_url
;; ;;
*) 4)
errornum sed -i "/^$provider_name /d" "$CRASHDIR"/configs/providers.cfg
;; ;;
esac *)
sleep 1 errornum
fi ;;
setproviders esac
;; fi
a) sleep 1
echo "-----------------------------------------------" ;;
echo -e "支持填写在线的\033[32mYClash订阅地址\033[0m或者\033[32m本地Clash配置文件\033[0m" a)
echo -e "本地配置文件请放在\033[32m$CRASHDIR\033[0m目录下并填写相对路径如【\033[32m./providers/test.yaml\033[0m】" echo "-----------------------------------------------"
echo "-----------------------------------------------" echo -e "支持填写在线的\033[32mYClash订阅地址\033[0m或者\033[32m本地Clash配置文件\033[0m"
read -p "请输入链接地址或本地相对路径 > " link echo -e "本地配置文件请放在\033[32m$CRASHDIR\033[0m目录下并填写相对路径如【\033[32m./providers/test.yaml\033[0m】"
link=$(echo $link | sed 's/ //g') #去空格 echo "-----------------------------------------------"
[ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && { read -p "请输入链接地址或本地相对路径 > " link
read -p "请输入名称或代号(不可重复,不支持纯数字) > " name link=$(echo $link | sed 's/ //g') #去空格
name=$(echo $name | sed 's/ //g') [ -n "$(echo $link | grep -E '.*\..*|^\./')" ] && {
[ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg && { read -p "请输入名称或代号(不可重复,不支持纯数字) > " name
echo "-----------------------------------------------" name=$(echo $name | sed 's/ //g')
echo -e "名称:\033[36m$name\033[0m" [ -n "$name" ] && [ -z "$(echo "$name" | grep -E '^[0-9]+$')" ] && ! grep -q "$name" "$CRASHDIR"/configs/providers.cfg && {
echo -e "链接地址/路径:\033[32m$link\033[0m" echo "-----------------------------------------------"
read -p "确认添加?(1/0) > " res echo -e "名称:\033[36m$name\033[0m"
[ "$res" = 1 ] && { echo -e "链接地址/路径:\033[32m$link\033[0m"
echo "$name $link" >> "$CRASHDIR"/configs/providers.cfg read -p "确认添加?(1/0) > " res
echo -e "\033[32mproviders已添加\033[0m" [ "$res" = 1 ] && {
} echo "$name $link" >>"$CRASHDIR"/configs/providers.cfg
} echo -e "\033[32mproviders已添加\033[0m"
} }
[ "$?" != 0 ] && echo -e "\033[31m输入错误操作已取消\033[0m" }
sleep 1 }
setproviders [ "$?" != 0 ] && echo -e "\033[31m输入错误操作已取消\033[0m"
;; sleep 1
c) ;;
echo "-----------------------------------------------" c)
if [ -s "$CRASHDIR"/configs/providers.cfg ];then echo "-----------------------------------------------"
echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通\033[0m" if [ -s "$CRASHDIR"/configs/providers.cfg ]; then
echo "-----------------------------------------------" echo -e "\033[33msingboxr与mihomo内核的providers配置文件不互通\033[0m"
read -p "确认生成${coretype}配置文件?(1/0) > " res echo "-----------------------------------------------"
[ "$res" = "1" ] && { read -p "确认生成${coretype}配置文件?(1/0) > " res
gen_${coretype}_providers [ "$res" = "1" ] && {
} gen_${coretype}_providers
else }
echo -e "\033[31m你还未添加链接或本地配置文件请先添加\033[0m" else
sleep 1 echo -e "\033[31m你还未添加链接或本地配置文件请先添加\033[0m"
fi sleep 1
setproviders fi
;; ;;
b) b)
echo "-----------------------------------------------" echo "-----------------------------------------------"
echo -e "当前规则模版为:\033[32m$provider_temp_des\033[0m" echo -e "当前规则模版为:\033[32m$provider_temp_des\033[0m"
echo -e "\033[33m请选择在线模版\033[0m" echo -e "\033[33m请选择在线模版\033[0m"
echo "-----------------------------------------------" echo "-----------------------------------------------"
cat "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print " "NR" "$1}' cat "$CRASHDIR"/configs/${coretype}_providers.list | awk '{print " "NR" "$1}'
echo "-----------------------------------------------" echo "-----------------------------------------------"
echo -e " a 使用\033[36m本地模版\033[0m" echo -e " a 使用\033[36m本地模版\033[0m"
echo "-----------------------------------------------" echo "-----------------------------------------------"
read -p "请输入对应字母或数字 > " num read -p "请输入对应字母或数字 > " num
case "$num" in case "$num" in
0) "" | 0) ;;
;; a)
a) read -p "请输入模版的路径(绝对路径) > " dir
read -p "请输入模版的路径(绝对路径) > " dir if [ -s $dir ]; then
if [ -s $dir ];then provider_temp_file=$dir
provider_temp_file=$dir setconfig provider_temp_${coretype} $provider_temp_file
setconfig provider_temp_${coretype} $provider_temp_file echo -e "\033[32m设置成功\033[0m"
echo -e "\033[32m设置成功\033[0m" else
else echo -e "\033[31m输入错误找不到对应模版文件\033[0m"
echo -e "\033[31m输入错误找不到对应模版文件\033[0m" fi
fi sleep 1
sleep 1 ;;
;; *)
*) provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${coretype}_providers.list 2>/dev/null | awk '{print $2}')
provider_temp_file=$(sed -n "$num p" "$CRASHDIR"/configs/${coretype}_providers.list 2>/dev/null | awk '{print $2}') if [ -z "$provider_temp_file" ]; then
if [ -z "$provider_temp_file" ];then errornum
errornum sleep 1
else else
setconfig provider_temp_${coretype} $provider_temp_file setconfig provider_temp_${coretype} $provider_temp_file
fi fi
;; ;;
esac esac
setproviders ;;
;; d)
d) read -p "确认清空全部链接?(1/0) > " res
read -p "确认清空全部链接?(1/0) > " res [ "$res" = "1" ] && rm -rf "$CRASHDIR"/configs/providers.cfg
[ "$res" = "1" ] && rm -rf "$CRASHDIR"/configs/providers.cfg ;;
setproviders e)
;; echo -e "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m"
e) read -p "是否继续?(1/0) > " res
echo -e "\033[33m将清空 $CRASHDIR/providers 目录下所有内容\033[0m" [ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers
read -p "是否继续?(1/0) > " res ;;
[ "$res" = "1" ] && rm -rf "$CRASHDIR"/providers *)
setproviders errornum
;; sleep 1
*) break
errornum ;;
;; esac
esac done
} }
set_clash_adv(){ #自定义clash高级规则 set_clash_adv(){ #自定义clash高级规则