Browse Source

重构cursor_mac_id_modifier.sh脚本,新增通用菜单选择函数以提升用户交互体验。优化了用户输入处理逻辑,简化了备份文件恢复和其他选项的选择过程,增强了日志记录功能,确保用户选择的可追溯性。

pull/366/head v0.0.136
煎饼果子卷鲨鱼辣椒 3 months ago
parent
commit
42b6c3f159
  1. 216
      scripts/run/cursor_mac_id_modifier.sh

216
scripts/run/cursor_mac_id_modifier.sh

@ -950,30 +950,24 @@ restore_feature() {
echo
log_info "可用的备份文件:"
echo "0) 退出 (默认)"
# 显示备份文件列表
# 构建菜单选项字符串
menu_options="退出 - 不恢复任何文件"
for i in "${!backup_files[@]}"; do
echo "$((i+1))) $(basename "${backup_files[$i]}")"
menu_options="$menu_options|$(basename "${backup_files[$i]}")"
done
echo
echo -n "请选择要恢复的备份文件编号 [0-${#backup_files[@]}] (默认: 0): "
read -r choice
# 使用菜单选择函数
select_menu_option "请使用上下箭头选择要恢复的备份文件,按Enter确认:" "$menu_options" 0
choice=$?
# 处理用户输入
if [ -z "$choice" ] || [ "$choice" = "0" ]; then
if [ "$choice" = "0" ]; then
log_info "跳过恢复操作"
return 0
fi
# 验证输入
if ! [[ "$choice" =~ ^[0-9]+$ ]] || [ "$choice" -gt "${#backup_files[@]}" ]; then
log_error "无效的选择"
return 1
fi
# 获取选择的备份文件
# 获取选择的备份文件 (减1是因为第一个选项是"退出")
local selected_backup="${backup_files[$((choice-1))]}"
# 验证文件存在性和可读性
@ -1031,6 +1025,78 @@ fix_damaged_app() {
return 0
}
# 新增:通用菜单选择函数
# 参数:
# $1 - 提示信息
# $2 - 选项数组,格式为 "选项1|选项2|选项3"
# $3 - 默认选项索引 (从0开始)
# 返回: 选中的选项索引 (从0开始)
select_menu_option() {
local prompt="$1"
IFS='|' read -ra options <<< "$2"
local default_index=${3:-0}
local selected_index=$default_index
local key_input
local cursor_up='\033[A'
local cursor_down='\033[B'
local enter_key=$'\n'
# 保存光标位置
tput sc
# 显示提示信息
echo -e "$prompt"
# 第一次显示菜单
for i in "${!options[@]}"; do
if [ $i -eq $selected_index ]; then
echo -e " ${GREEN}${NC} ${options[$i]}"
else
echo -e " ${options[$i]}"
fi
done
# 循环处理键盘输入
while true; do
# 读取单个按键
read -rsn3 key_input
# 检测按键
case "$key_input" in
# 上箭头键
$'\033[A')
if [ $selected_index -gt 0 ]; then
((selected_index--))
fi
;;
# 下箭头键
$'\033[B')
if [ $selected_index -lt $((${#options[@]}-1)) ]; then
((selected_index++))
fi
;;
# Enter键
"")
echo # 换行
log_info "您选择了: ${options[$selected_index]}"
return $selected_index
;;
esac
# 恢复光标位置
tput rc
# 重新显示菜单
for i in "${!options[@]}"; do
if [ $i -eq $selected_index ]; then
echo -e " ${GREEN}${NC} ${options[$i]}"
else
echo -e " ${options[$i]}"
fi
done
done
}
# 主函数
main() {
@ -1080,33 +1146,13 @@ main() {
# 询问用户是否要修改主程序文件
echo
log_warn "是否要修改 Cursor 主程序文件?"
echo "0) 否 - 仅修改配置文件 (更安全但可能需要更频繁地重置)"
echo "1) 是 - 同时修改主程序文件 (更持久但有小概率导致程序不稳定)"
echo ""
printf "请输入选择 [0-1] (默认 1): "
# 使用更健壮的方式读取用户输入
app_choice=""
# 尝试通过多种方式清空输入缓冲区
# 方法1: 使用read -t
while read -r -t 0.1; do read -r; done 2>/dev/null
# 方法2: 重定向方式
exec <&-
exec < /dev/tty
# 尝试使用默认输入和/dev/tty两种方式读取
app_choice=$(read -r choice; echo "$choice")
if [ -z "$app_choice" ]; then
# 如果上面的方法失败,尝试直接使用/dev/tty
if [ -e "/dev/tty" ] && [ -r "/dev/tty" ] && [ -w "/dev/tty" ]; then
app_choice=$(head -n 1 < /dev/tty 2>/dev/null)
fi
fi
# 记录日志以便调试
echo "[INPUT_DEBUG] 读取到的选择: '$app_choice'" >> "$LOG_FILE"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 仅修改配置文件 (更安全但可能需要更频繁地重置)|是 - 同时修改主程序文件 (更持久但有小概率导致程序不稳定)" 1
app_choice=$?
# 记录到日志
echo "[INPUT_DEBUG] 读取到的选择: $app_choice" >> "$LOG_FILE"
# 确保脚本不会因为输入问题而终止
set +e
@ -1136,38 +1182,18 @@ main() {
# 添加MAC地址修改选项
echo
log_warn "是否要修改MAC地址?"
echo "0) 否 - 保持默认设置 (默认)"
echo "1) 是 - 修改MAC地址"
echo ""
printf "请输入选择 [0-1] (默认 0): "
# 使用更健壮的方式读取用户输入
mac_choice=""
# 尝试通过多种方式清空输入缓冲区
# 方法1: 使用read -t
while read -r -t 0.1; do read -r; done 2>/dev/null
# 方法2: 重定向方式
exec <&-
exec < /dev/tty
# 尝试使用默认输入和/dev/tty两种方式读取
mac_choice=$(read -r choice; echo "$choice")
if [ -z "$mac_choice" ]; then
# 如果上面的方法失败,尝试直接使用/dev/tty
if [ -e "/dev/tty" ] && [ -r "/dev/tty" ] && [ -w "/dev/tty" ]; then
mac_choice=$(head -n 1 < /dev/tty 2>/dev/null)
fi
fi
# 记录日志以便调试
echo "[INPUT_DEBUG] MAC地址选择: '$mac_choice'" >> "$LOG_FILE"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 保持默认设置|是 - 修改MAC地址 (推荐)" 1
mac_choice=$?
# 记录到日志
echo "[INPUT_DEBUG] MAC地址选择: $mac_choice" >> "$LOG_FILE"
# 确保脚本不会因为输入问题而终止
set +e
# 处理用户选择
# 处理用户选择 - 索引1对应"是"选项
if [ "$mac_choice" = "1" ]; then
log_info "您选择了修改MAC地址"
# 使用子shell执行修改,避免错误导致整个脚本退出
@ -1202,38 +1228,18 @@ main() {
# 提供修复选项(移到最后)
echo
log_warn "Cursor 修复选项"
echo "0) 忽略 - 不执行修复操作 (默认)"
echo "1) 修复模式 - 恢复原始的 Cursor 安装,修复之前修改导致的错误"
echo ""
printf "是否需要恢复原始 Cursor? [0-1] (默认 0): "
# 使用更健壮的方式读取用户输入
fix_choice=""
# 尝试通过多种方式清空输入缓冲区
# 方法1: 使用read -t
while read -r -t 0.1; do read -r; done 2>/dev/null
# 方法2: 重定向方式
exec <&-
exec < /dev/tty
# 尝试使用默认输入和/dev/tty两种方式读取
fix_choice=$(read -r choice; echo "$choice")
if [ -z "$fix_choice" ]; then
# 如果上面的方法失败,尝试直接使用/dev/tty
if [ -e "/dev/tty" ] && [ -r "/dev/tty" ] && [ -w "/dev/tty" ]; then
fix_choice=$(head -n 1 < /dev/tty 2>/dev/null)
fi
fi
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "忽略 - 不执行修复操作|修复模式 - 恢复原始的 Cursor 安装" 0
fix_choice=$?
# 记录日志以便调试
echo "[INPUT_DEBUG] 修复选项选择: '$fix_choice'" >> "$LOG_FILE"
echo "[INPUT_DEBUG] 修复选项选择: $fix_choice" >> "$LOG_FILE"
# 确保脚本不会因为输入问题而终止
set +e
# 处理用户选择
# 处理用户选择 - 索引1对应"修复模式"选项
if [ "$fix_choice" = "1" ]; then
log_info "您选择了修复模式"
# 使用子shell执行清理,避免错误导致整个脚本退出
@ -1266,28 +1272,16 @@ main() {
# 添加修复"应用已损坏"选项
echo
log_warn "应用修复选项"
echo "0) 忽略 - 不执行修复操作 (默认)"
echo "1) 修复"应用已损坏"问题 - 解决macOS提示应用已损坏无法打开的问题"
echo ""
printf "是否需要修复"应用已损坏"问题? [0-1] (默认 0): "
# 读取用户输入
damaged_choice=""
while read -r -t 0.1; do read -r; done 2>/dev/null
exec <&-
exec < /dev/tty
damaged_choice=$(read -r choice; echo "$choice")
if [ -z "$damaged_choice" ]; then
if [ -e "/dev/tty" ] && [ -r "/dev/tty" ] && [ -w "/dev/tty" ]; then
damaged_choice=$(head -n 1 < /dev/tty 2>/dev/null)
fi
fi
echo "[INPUT_DEBUG] 应用修复选项选择: '$damaged_choice'" >> "$LOG_FILE"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "忽略 - 不执行修复操作|修复"应用已损坏"问题 - 解决macOS提示应用已损坏无法打开的问题" 0
damaged_choice=$?
echo "[INPUT_DEBUG] 应用修复选项选择: $damaged_choice" >> "$LOG_FILE"
set +e
# 处理用户选择
# 处理用户选择 - 索引1对应"修复应用已损坏"选项
if [ "$damaged_choice" = "1" ]; then
log_info "您选择了修复"应用已损坏"问题"
(

Loading…
Cancel
Save