写一个ubuntu脚本(脚本的所有字体颜色为白、绿、黄,字体颜色和抬头颜色同时为三种颜色的随机色,有报错或提示信息输出时为红色,字体设置为较大字号、字体加粗) 运行脚本后第一层主界面,为脚本主界面: *************************************************************************** --------------------------自编译OPENWRT固件脚本---------------------------- *************************************************************************** * 1.安装openwrt依赖环境 * 2.下载openwrt源码 * 3. * 4. * 5. * 6. * 7. * 8. * 9. * 10.退出脚本 *************************************************************************** 输出“请选择相应的编号(1-10):” 主界面和所有的每一层的子界面(子菜单),都要加上抬头,抬头为: *************************************************************************** --------------------------自编译OPENWRT固件脚本---------------------------- *************************************************************************** 注意:请注意脚本的语法。脚本中务必要解决当用户有输入时,按退格键或del键不能删除的问题。 在主界面,当用户输入1进入(安装openwrt依赖环境)的子菜单: 1.直接安装openwrt所需依赖包 2.返回上一级界面 3.退出脚本 用户输入1执行命令: bash <(wget -qO- https://raw.githubusercontent.com/afala2020/openwrt-packages/refs/heads/main/yilai.sh) 用户输入2返回上一级界面 用户输入3则退出本脚本,注意不是退出用户登录,是返回到用户登录状态 在主界面,当用户输入2进入(下载openwrt源码)的子菜单: 1.下载LEDE源码 2.下载immortalwrt源码 3.返回上一级界面 4.退出本脚本 用户输入1进入(下载LEDE源码)的子菜单: 1.去下载LEDE源码 2.返回上一级界面 3.退出脚本 在(下载LEDE源码)的界面,用户输入1进入(选择路径)子菜单: 1.将源码下载到当前目录下 2.输入自定义,源码下载路径 3.返回上一级界面 4.退出本脚本 用户输入1执行命令,提示“开始下载lede源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone https://github.com/coolsnowwolf/lede 源码下载成功后,输出提示“LEDE源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入2时,提示: 请输入lede源码的下载路径(绝对路径),要解决: 用户输入绝对路径后判断路径是否存在,不存在则提示“输入的路径不存在!”,并返回(选择路径)子菜单; 如果存在,则提示“开始下载lede源码到:用户输入的路径”,并执行下载命令: git clone https://github.com/coolsnowwolf/lede 源码下载成功后,输出提示“LEDE源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入3返回上一级界面 当用户输入4则退出本脚本,注意不是退出用户登录,是返回到用户登录状态 在(下载openwrt源码)的界面,用户输入2进入(下载immortalwrt源码)的子菜单: 1.将源码下载到当前目录下 2.输入自定义,源码下载路径 3.返回上一级界面 4.退出本脚本 在(下载immortalwrt源码)的界面,用户输入1时,进入(immortalwrt源码版本选择)的子菜单: 1.下载immortalwrt-18.06k5.4 2.下载immortalwrt-18.06 3.下载immortalwrt-21.02 4.下载immortalwrt-23.05 5.下载immortalwrt-24.10 6.返回上一级界面 7.退出本脚本 在(immortalwrt源码版本选择)的界面: 当用户输入1时,提示“开始下载immortalwrt-18.06k5.4源码到:当前路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-18.06-k5.4 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt1806k54 源码下载成功后,输出提示“immortalwrt-18.06k5.4源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入2时,提示“开始下载immortalwrt-18.06源码到:当前路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-18.06 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt1806 源码下载成功后,输出提示“immortalwrt-18.06源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入3时,提示“开始下载immortalwrt-21.02源码到:当前路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-21.02 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2102 源码下载成功后,输出提示“immortalwrt-21.02源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入4时,提示“开始下载immortalwrt-23.05源码到:当前路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-23.05 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2305 源码下载成功后,输出提示“immortalwrt-23.05源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入5时,提示“开始下载immortalwrt-24.10源码到:当前路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-24.10 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2410 源码下载成功后,输出提示“immortalwrt-2410源码已下载到:”+当前路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入6返回上一级界面 当用户输入7则退出本脚本,注意不是退出用户登录,是返回到用户登录状态 在(下载immortalwrt源码)的界面: 当用户输入2时,提示:"请输入immortalwrt源码的下载路径(绝对路径):" 用户输入绝对路径后判断路径是否存在,不存在则提示“输入的路径不存在!”,并返回重新输入状态; 如果存在,则输出提示“immortalwrt源码将下载到:用户输入的路径!” 进入(immortalwrt源码版本选择)的子菜单: 1.下载immortalwrt-18.06k5.4 2.下载immortalwrt-18.06 3.下载immortalwrt-21.02 4.下载immortalwrt-23.05 5.下载immortalwrt-24.10 6.返回上一级界面 7.退出本脚本 在(immortalwrt源码版本选择)的界面: 当用户输入1时,提示“开始下载immortalwrt-18.06k5.4源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-18.06-k5.4 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt1806k54 源码下载成功后,输出提示“immortalwrt-18.06k5.4源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入2时,提示“开始下载immortalwrt-18.06源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-18.06 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt1806 源码下载成功后,输出提示“immortalwrt-18.06源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入3时,提示“开始下载immortalwrt-21.02源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-21.02 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2102 源码下载成功后,输出提示“immortalwrt-21.02源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入4时,提示“开始下载immortalwrt-23.05源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-23.05 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2305 源码下载成功后,输出提示“immortalwrt-23.05源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入5时,提示“开始下载immortalwrt-24.10源码到:用户输入的路径”,执行下面命令将源码下载到当前目录下: git clone -b openwrt-24.10 --single-branch https://github.com/immortalwrt/immortalwrt immortalwrt2410 源码下载成功后,输出提示“immortalwrt-2410源码已下载到:”+用户输入的路径 输出提示“按任意键返回脚本主界面!”,按任意键返回 脚本的主界面 当用户输入6返回上一级界面 当用户输入7则退出本脚本,注意不是退出用户登录,是返回到用户登录状态 在(下载immortalwrt源码)的界面: 当用户输入3时,返回上一级界面 在(下载immortalwrt源码)的界面: 当用户输入4时,返回到当前用户登录后的界面 在(下载openwrt源码)的界面: 当用户输入3返回上一级界面 当用户输入4则退出本脚本,注意不是退出用户登录,是返回到用户登录状态
时间: 2025-05-26 19:52:57 浏览: 22
<think>嗯,用户想设计一个Ubuntu脚本来自编译OpenWRT固件,要求有多级菜单、颜色设置、错误处理等功能。首先,我需要理清楚整个编译流程的大致步骤,比如安装依赖、下载源码、配置、编译这些环节。然后,用户提到的交互式菜单,可能需要使用bash的select语句或者dialog工具来实现多级菜单。不过用户希望有颜色和字体设置,可能需要用转义序列来控制终端颜色,比如\e[31m这种格式。但要注意兼容性,不同终端可能支持程度不同,所以可能需要测试一下。
接下来是颜色随机设置的问题,用户想要白、绿、黄随机,可能需要生成一个随机数,然后根据数值选择颜色代码。比如用RANDOM变量取模3,然后对应不同的颜色。另外,报错信息要红色且加粗,可能需要组合转义码,比如\e[1;31m。然后字体较大这个可能不太容易,终端一般不支持改变字体大小,可能需要用figlet之类的工具生成大文字,或者用户可能指的是加粗,所以用\e[1m来实现加粗。
然后是输入时的退格键和Del键无法正常工作的问题。这通常是因为read命令在非原始模式下处理输入,导致退格被当作字符。解决方法可能是在read前加上stty的调整,比如sttysane或者设置erase字符。例如stty erase^H,但具体可能需要测试。或者使用read -e选项启用行编辑,但bash的read是否支持这个选项需要确认。关于依赖安装部分,需要列出OpenWRT编译所需的包,比如build-essential,libncurses-dev等,用apt-get安装。同时要处理安装过程中的错误,比如用set-e或者检查返回值,如果失败则显示红色错误信息并退出。
下载源码的部分,用户提到了不同版本如LEDE、immortalwrt,可能需要让用户选择,然后gitclone对应的仓库。需要检查git是否安装,以及clone是否成功,否则报错。之后进入源码目录,执行makemenuconfig之类的命令,但编译过程可能需要用户交互,所以脚本可能需要提示用户进行配置。错误处理方面,整个脚本需要set-euopipefail来捕获错误,或者在关键步骤后检查$?。另外,使用trap命令在脚本退出时恢复终端的颜色设置和stty设置,避免影响后续使用。
多级菜单的实现,主菜单可能有安装依赖、选择源码、编译等选项,每个选项进入子菜单。比如选择源码后,子菜单列出不同的项目,用户选择后变量保存选择的URL。可能需要使用case语句配合select循环来构建菜单结构。
颜色函数的部分,可以定义几个函数,比如red()输出红色文字,green()输出绿色,这样在需要的地方调用。随机颜色可能需要在每次菜单显示时随机选择,或者每次提示信息使用不同的颜色。测试脚本时,可能会遇到权限问题,比如安装依赖需要sudo,所以脚本中可能需要检查是否以root运行,或者提示用户输入密码。但sudo可能导致环境变量变化,需要注意。
还有,用户可能希望脚本在Ubuntu的不同版本上都能运行,比如20.04、22.04等,需要确保依赖包的名字一致,或者处理不同的包管理情况。
最后,生成相关问题需要考虑用户可能遇到的后续问题,比如编译失败如何处理,如何添加自定义软件包,如何优化编译速度,多线程编译等。可能还需要提及如何清理编译环境,或者如何更新源码。</think>根据您对OpenWRT编译脚本的需求,我将分步骤说明如何创建功能完整的交互式脚本。以下是整合多级菜单、颜色控制和异常处理的实现方案:
### 一、基础环境搭建
1. 创建脚本文件并设置权限
```bash
touch openwrt_builder.sh && chmod +x openwrt_builder.sh
```
### 二、终端控制函数库
```bash
#!/bin/bash
# 颜色控制函数
set_color() {
case $(($RANDOM % 3)) in
0) echo -ne "\033[1;37m";; # 白
1) echo -ne "\033[1;32m";; # 绿
2) echo -ne "\033[1;33m";; # 黄
esac
}
reset_color() { echo -ne "\033[0m"; }
error_color() { echo -ne "\033[1;31m"; } # 红+加粗
```
### 三、输入处理设置
```bash
# 修复退格键问题
stty sane
stty erase ^H
```
### 四、多级菜单系统
```bash
main_menu() {
while true; do
clear
set_color
echo "★ OpenWRT 编译系统 ★"
reset_color
COLUMNS=1
select opt in "安装依赖" "选择源码" "开始编译" "退出系统"; do
case $REPLY in
1) install_dependencies ;;
2) source_select_menu ;;
3) start_compilation ;;
4) exit 0 ;;
*) error_prompt "无效选项"; break ;;
esac
break
done
done
}
source_select_menu() {
clear
set_color
echo "▼ 源码仓库选择 ▼"
reset_color
COLUMNS=1
select src in "LEDE" "ImmortalWRT" "自定义地址"; do
case $src in
LEDE) REPO_URL="https://github.com/coolsnowwolf/lede" ;;
ImmortalWRT) REPO_URL="https://github.com/immortalwrt/immortalwrt" ;;
自定义地址) read -p "输入Git仓库地址:" REPO_URL ;;
esac
return
done
}
```
### 五、核心功能实现
```bash
install_dependencies() {
local deps=(
build-essential libncurses5-dev libncursesw5-dev
zlib1g-dev gawk git gettext libssl-dev xsltproc
rsync wget unzip python3
)
if ! sudo apt-get install -y "${deps[@]}"; then
error_color
echo -e "\n❗ 依赖安装失败!"
reset_color
exit 1
fi
}
start_compilation() {
[ -z "$REPO_URL" ] && { error_prompt "请先选择源码仓库"; return; }
git clone --depth 1 $REPO_URL openwrt_src || {
error_color
echo -e "\n❗ 仓库克隆失败!"
reset_color
exit 1
}
cd openwrt_src
make menuconfig || handle_compile_error
make -j$(nproc) || handle_compile_error
}
handle_compile_error() {
error_color
echo -e "\n‼ 编译过程出现错误!"
reset_color
exit 1
}
```
### 六、异常处理增强
```bash
trap 'error_color; echo "脚本异常终止!"; reset_color; exit 1' SIGINT SIGTERM
```
### 七、执行入口
```bash
# 初始化环境
check_dependencies() {
[ -x "$(command -v git)" ] || {
error_color
echo "Git 未安装!"
reset_color
exit 1
}
}
check_dependencies
main_menu
```
阅读全文
相关推荐









