From 85396a6b5df68f11542b6d73b1e7a4e31fa0abeb Mon Sep 17 00:00:00 2001 From: Sofia <253282481+sofia-riese@users.noreply.github.com> Date: Sat, 10 Jan 2026 09:04:56 +0800 Subject: [PATCH] refactor: replace recursion with while loop in setdir --- install.sh | 210 +++++++++++++++++++++++++++++------------------------ 1 file changed, 115 insertions(+), 95 deletions(-) diff --git a/install.sh b/install.sh index d8dc188c..089fccc2 100644 --- a/install.sh +++ b/install.sh @@ -100,28 +100,37 @@ gettar() { fi fi } -setdir() { - set_usb_dir() { + +set_usb_dir() { + while true; do $echo "请选择安装目录" du -hL /mnt | awk '{print " "NR" "$2" "$1}' read -p "请输入相应数字 > " num dir=$(du -hL /mnt | awk '{print $2}' | sed -n "$num"p) if [ -z "$dir" ]; then $echo "\033[31m输入错误!请重新设置!\033[0m" - set_usb_dir + continue fi - } - set_asus_dir() { + break 1 + done +} + +set_asus_dir() { + while true; do echo -e "请选择U盘目录" du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print " "NR" "$2" "$1}' read -p "请输入相应数字 > " num dir=$(du -hL /tmp/mnt | awk -F/ 'NF<=4' | awk '{print $2}' | sed -n "$num"p) if [ ! -f "$dir/asusware.arm/etc/init.d/S50downloadmaster" ]; then echo -e "\033[31m未找到下载大师自启文件:$dir/asusware.arm/etc/init.d/S50downloadmaster,请检查设置!\033[0m" - set_asus_dir + continue fi - } - set_cust_dir() { + break 1 + done +} + +set_cust_dir() { + while true; do echo "-----------------------------------------------" echo '可用路径 剩余空间:' df -h | awk '{print $6,$4}' | sed 1d @@ -129,112 +138,123 @@ setdir() { read -p "请输入自定义路径 > " dir if [ "$(dir_avail $dir)" = 0 ] || [ -n "$(echo $dir | grep -E 'tmp|opt|sys')" ]; then $echo "\033[31m路径错误!请重新设置!\033[0m" - set_cust_dir + continue fi - } - echo "-----------------------------------------------" - $echo "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m" - if [ -n "$systype" ]; then - [ "$systype" = "Padavan" ] && dir=/etc/storage - [ "$systype" = "mi_snapshot" ] && { - $echo "\033[33m检测到当前设备为小米官方系统,请选择安装位置\033[0m" - [ -d /data ] && $echo " 1 安装到 /data 目录,剩余空间:$(dir_avail /data -h)(支持软固化功能)" - [ -d /userdisk ] && $echo " 2 安装到 /userdisk 目录,剩余空间:$(dir_avail /userdisk -h)(支持软固化功能)" - [ -d /data/other_vol ] && $echo " 3 安装到 /data/other_vol 目录,剩余空间:$(dir_avail /data/other_vol -h)(支持软固化功能)" - $echo " 4 安装到自定义目录(不推荐,不明勿用!)" + break 1 + done +} + +setdir() { + while true; do + echo "-----------------------------------------------" + $echo "\033[33m注意:安装ShellCrash至少需要预留约1MB的磁盘空间\033[0m" + if [ -n "$systype" ]; then + [ "$systype" = "Padavan" ] && dir=/etc/storage + [ "$systype" = "mi_snapshot" ] && { + $echo "\033[33m检测到当前设备为小米官方系统,请选择安装位置\033[0m" + [ -d /data ] && $echo " 1 安装到 /data 目录,剩余空间:$(dir_avail /data -h)(支持软固化功能)" + [ -d /userdisk ] && $echo " 2 安装到 /userdisk 目录,剩余空间:$(dir_avail /userdisk -h)(支持软固化功能)" + [ -d /data/other_vol ] && $echo " 3 安装到 /data/other_vol 目录,剩余空间:$(dir_avail /data/other_vol -h)(支持软固化功能)" + $echo " 4 安装到自定义目录(不推荐,不明勿用!)" + $echo " 0 退出安装" + echo "-----------------------------------------------" + read -p "请输入相应数字 > " num + case "$num" in + 1) + dir=/data + ;; + 2) + dir=/userdisk + ;; + 3) + dir=/data/other_vol + ;; + 4) + set_cust_dir + ;; + *) + exit 1 + ;; + esac + } + [ "$systype" = "asusrouter" ] && { + $echo "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m" + $echo " 1 基于USB设备安装(限23年9月之前固件,须插入\033[31m任意\033[0mUSB设备)" + $echo " 2 基于自启脚本安装(仅支持梅林及部分非koolshare官改固件)" + $echo " 3 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" + $echo " 0 退出安装" + echo "-----------------------------------------------" + read -p "请输入相应数字 > " num + case "$num" in + 1) + read -p "将脚本安装到USB存储/系统闪存?(1/0) > " res + [ "$res" = "1" ] && set_usb_dir || dir=/jffs + usb_status=1 + ;; + 2) + $echo "如无法正常开机启动,请重新使用USB方式安装!" + sleep 2 + dir=/jffs + ;; + 3) + echo -e "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!" + sleep 2 + set_asus_dir + ;; + *) + exit 1 + ;; + esac + } + [ "$systype" = "ng_snapshot" ] && dir=/tmp/mnt + else + $echo " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)" + $echo " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" + $echo " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)" + $echo " 4 在\033[32m外置存储\033[0m中安装" + $echo " 5 手动设置安装目录" $echo " 0 退出安装" - echo "-----------------------------------------------" + echo "----------------------------------------------" read -p "请输入相应数字 > " num + # 设置目录 case "$num" in 1) - dir=/data + dir=/etc ;; 2) - dir=/userdisk + dir=/usr/share ;; 3) - dir=/data/other_vol + dir=~/.local/share + mkdir -p ~/.config/systemd/user ;; 4) + set_usb_dir + ;; + 5) set_cust_dir ;; *) + echo "安装已取消" exit 1 ;; esac - } - [ "$systype" = "asusrouter" ] && { - $echo "\033[33m检测到当前设备为华硕固件,请选择安装方式\033[0m" - $echo " 1 基于USB设备安装(限23年9月之前固件,须插入\033[31m任意\033[0mUSB设备)" - $echo " 2 基于自启脚本安装(仅支持梅林及部分非koolshare官改固件)" - $echo " 3 基于U盘+下载大师安装(支持所有固件,限ARM设备,须插入U盘或移动硬盘)" - $echo " 0 退出安装" - echo "-----------------------------------------------" - read -p "请输入相应数字 > " num - case "$num" in - 1) - read -p "将脚本安装到USB存储/系统闪存?(1/0) > " res - [ "$res" = "1" ] && set_usb_dir || dir=/jffs - usb_status=1 - ;; - 2) - $echo "如无法正常开机启动,请重新使用USB方式安装!" - sleep 2 - dir=/jffs - ;; - 3) - echo -e "请先在路由器网页后台安装下载大师并启用,之后选择外置存储所在目录!" - sleep 2 - set_asus_dir - ;; - *) - exit 1 - ;; - esac - } - [ "$systype" = "ng_snapshot" ] && dir=/tmp/mnt - else - $echo " 1 在\033[32m/etc目录\033[0m下安装(适合root用户)" - $echo " 2 在\033[32m/usr/share目录\033[0m下安装(适合Linux系统)" - $echo " 3 在\033[32m当前用户目录\033[0m下安装(适合非root用户)" - $echo " 4 在\033[32m外置存储\033[0m中安装" - $echo " 5 手动设置安装目录" - $echo " 0 退出安装" - echo "----------------------------------------------" - read -p "请输入相应数字 > " num - #设置目录 - case "$num" in - 1) - dir=/etc - ;; - 2) - dir=/usr/share - ;; - 3) - dir=~/.local/share - mkdir -p ~/.config/systemd/user - ;; - 4) - set_usb_dir - ;; - 5) - set_cust_dir - ;; - *) - echo "安装已取消" - exit 1 - ;; - esac - fi + fi - if [ ! -w $dir ]; then - $echo "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" && sleep 1 && setdir - else - $echo "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)" - read -p "确认安装?(1/0) > " res - [ "$res" = "1" ] && CRASHDIR=$dir/ShellCrash || setdir - fi + if [ ! -w $dir ]; then + $echo "\033[31m没有$dir目录写入权限!请重新设置!\033[0m" + sleep 1 + else + $echo "目标目录\033[32m$dir\033[0m空间剩余:$(dir_avail $dir -h)" + read -p "确认安装?(1/0) > " res + if [ "$res" = "1" ]; then + CRASHDIR=$dir/ShellCrash + break + fi + fi + done } + install() { echo "-----------------------------------------------" echo 开始从服务器获取安装文件!