diff --git a/CLAUDE.md b/CLAUDE.md
index ce83873..b52493f 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -12,7 +12,7 @@ PVE Tools Pro 是一个面向 Proxmox VE 9.x 的交互式 Bash 运维工具集
- **入口层**: `PVE-Tools.sh`(约 330 行)-- 本地开发时按固定顺序 source lib/ 与 src/modules/(各模块 init.sh 显式优先);远程 curl 运行时从 GitHub Releases(`releases/latest/download/PVE-Tools.sh`)下载构建产物执行,带重试/限速/校验/原子落盘守护。
- **基础设施层**: `lib/` -- 全局变量(config.sh)、日志/UI/确认/备份/GRUB(core.sh)、菜单交互框架(menu.sh)、网络检测/镜像选择(network.sh)、运行时守卫与主循环(runtime.sh)。
-- **功能模块层**: `src/modules/` -- 10 个子目录对应主菜单 1-10 项,每个子目录内按功能拆分文件(init.sh 为菜单入口)。
+- **功能模块层**: `src/modules/` -- 11 个子目录对应主菜单 1-11 项,每个子目录内按功能拆分文件(init.sh 为菜单入口)。
- **构建系统**: `build.sh` 按顺序拼接 lib/*.sh + src/modules/**/*.sh 为 `dist/PVE-Tools.sh`(gitignore,CI 构建);`dev.sh` 直接 source 全部源码供开发调试。
- **辅助工具集**: `Tools/` 集成来自 tteck 社区的 13 个独立维护脚本(不参与构建,供用户手动执行)。
- **插件市场**: `Modules/` 提供第三方脚本与二进制资产;`Modules/VGPU/*.so` 是 vGPU Unlock 功能的下载资产,不可删改。
@@ -47,6 +47,7 @@ graph TD
SRC --> M08["08-tools-about
诊断工具与项目信息"]
SRC --> M09["09-security
安全中心"]
SRC --> M10["10-third-party
第三方工具"]
+ SRC --> M11["11-help
获取帮助"]
GHA --> W1["workflows/
release/beta/PR"]
@@ -64,7 +65,7 @@ graph TD
|---|---|---|---|---|
| `/` (根) | Bash | 入口脚本:本地 source / 远程下载 Releases 单文件 | `PVE-Tools.sh` (~330行) | `README.md` |
| `lib/` | Bash | 基础设施层:全局变量、日志、UI、菜单框架、网络、运行时 | `config.sh`, `core.sh`, `menu.sh`, `network.sh`, `runtime.sh` | [lib/CLAUDE.md](./lib/CLAUDE.md) |
-| `src/modules/` | Bash | 功能模块层:10 个子模块,对应主菜单 1-10 | 各 `*/init.sh` | [src/CLAUDE.md](./src/CLAUDE.md) |
+| `src/modules/` | Bash | 功能模块层:11 个子模块,对应主菜单 1-11 | 各 `*/init.sh` | [src/CLAUDE.md](./src/CLAUDE.md) |
| `Tools/` | Bash | 第三方系统维护脚本集(13个,不参与构建) | 各 `.sh` 文件 | [Tools/CLAUDE.md](./Tools/CLAUDE.md) |
| `Modules/` | Bash/二进制 | 插件市场与分发资产(VGPU .so 为下载资产) | `install-zsh.sh`, `VGPU/*.so` | [Modules/CLAUDE.md](./Modules/CLAUDE.md) |
| `Docs/` | Markdown | 补充文档与《重构计划》设计稿 | `future-guide.md`, `重构计划-PVE-Tools模块化拆分.md` | -- |
@@ -214,6 +215,7 @@ foo_menu_dispatch() { # case 处理选项;未识别 return 1;末尾必
| 日期 | 变更 | 来源 |
|---|---|---|
+| 2026-08-19 | 硬件直通一键配置 (IOMMU) 新增可选增强参数:iommu=pt 与 pcie_acs_override=downstream,multifunction(强制拆分 IOMMU 组,解决 GPU 与系统盘同组时 vfio-pci 误接管系统盘问题);关闭流程同步移除 | GitHub Issue |
| 2026-07-26 | 交互层框架化:新增 lib/menu.sh,全部菜单迁移 run_menu;确认体系两档成文;GPU 直通 marker 统一与互斥检测;GRUB 参数函数数组化;文档按现实重写(修正入口行数/远程模式/shc 等失真);仓库卫生清理;CI 护栏补全 | 交互层收口整理 |
| 2026-07-08 | 项目模块化重构完成:单文件拆分为 lib/ + src/modules/(10 子模块)。新增 build.sh/dev.sh。Web/ 目录移除。 | claude-init 架构师 |
| 2026-04-28 | 初始化 CLAUDE.md 体系 | claude-init 架构师 |
diff --git a/Docs/CHANGELOG.md b/Docs/CHANGELOG.md
new file mode 100644
index 0000000..34b2b42
--- /dev/null
+++ b/Docs/CHANGELOG.md
@@ -0,0 +1,47 @@
+# 更新日志 (Changelog)
+
+更新日志明细,面向用户。线上更新检测数据源见根目录 `UPDATE` 文件(本文件为详细版)。
+
+## v11.1.0 (2026-08-19)
+
+### 新增:获取帮助板块(主菜单 11)
+
+新增独立板块,二级菜单三个入口:
+
+1. **加 Q 群水群** — QQ 群 `1031976463`,PVE 玩法与踩坑经验交流
+2. **加聊天社区咨询** — Telegram 群 `https://t.me/pvetools233`,与 QQ 水群相互独立
+3. **加作者付费咨询** — 一对一技术支持 / 紧急情况 / 深度排查 / 合作洽谈
+
+付费咨询说明:项目免费开源,但作者**一般不提供免费的技术支持和免费解答方案**;紧急情况或谈合作欢迎直接联系作者(QQ `1520942621` / 微信 `kilomaple2024` / Telegram `https://t.me/pvetools_bot` / 邮件 `contact@u3u.icu`)。觉得工具好用想赞助作者,可前往官网支持页 `https://pve.u3u.icu/support` 或直接联系作者转账。
+
+### 新增:硬件直通一键配置 (IOMMU) 可选增强参数
+
+在「4. 硬件直通与显卡 → 6. 硬件直通一键配置 (IOMMU)」开启流程中,新增可选确认步骤,可选择写入直通增强参数:
+
+- `iommu=pt` — 开启 IOMMU 直通模式,减少 DMA 重映射开销
+- `pcie_acs_override=downstream,multifunction` — 强制拆分 IOMMU 组
+
+适用场景:部分主板在 PCIe 拆分后会将 GPU 与系统盘/NVMe 分配到**同一个 IOMMU 组**,GPU 直通时 vfio-pci 会按组接管所有设备(包括系统盘),导致开机即崩溃。本选项可避免此问题。关闭流程已同步移除这两个参数。
+
+### 修复:温度监控误报 nvme0
+
+修复了无 NVMe 硬盘时温度监控误报「检测到 nvme0 / 已添加 1 块」的问题。根因是 bash glob 在无匹配时返回字面模式字符串 `/dev/nvme[0-9]`,被误当作真实设备;现在循环内增加真实块设备校验,无设备时正确显示「已添加 0 块」。
+
+### 其他
+
+- 修正 MAC 绑定接口名校验的错误提示文案(「不允许特殊字符」)
+
+---
+
+## v11.0.0 (2026-07-26)
+
+- 交互层框架化:新增 `lib/menu.sh`,全部菜单迁移 `run_menu`,统一 EOF/Ctrl+C 守卫与 pause 节奏
+- 确认体系两档成文:轻档 `confirm_action` / 重档 `confirm_high_risk_action`(指定确认词)
+- GPU 直通加固:marker 统一写入、多方案互斥检测、IOMMU 开/关强制确认;去掉写死 PCI ID 与默认核显黑名单
+- GRUB 参数数组化精确增删,新增 `grub_has_param`;默认内核优先 `proxmox-boot-tool kernel pin`
+- 远程安装与自更新改走 GitHub Releases 完整单文件;修正 vGPU so 真实路径
+- CI 护栏补全:源码 shellcheck、构建函数一致性、UPDATE 新鲜度、dist 安全扫描、发版前校验与 SHA256SUMS
+- 文档与仓库卫生:按现实重写 CLAUDE/AGENTS;修正 README-JP 文件名;清理历史截图与无关大文件
+- Build 代号更新为 Liino
+
+更早期版本历史请见根目录 `UPDATE` 文件与 GitHub Releases。
diff --git a/UPDATE b/UPDATE
index 52b0a77..99e9cb5 100644
--- a/UPDATE
+++ b/UPDATE
@@ -1,3 +1,9 @@
+v11.1.0
+- 新增「获取帮助」板块(主菜单 11):QQ 水群 / Telegram 聊天社区 / 作者付费咨询与赞助入口
+- 硬件直通一键配置 (IOMMU) 新增可选增强参数:iommu=pt 与 pcie_acs_override=downstream,multifunction(强制拆分 IOMMU 组,解决 GPU 与系统盘同组时 vfio-pci 误接管系统盘问题)
+- 修复温度监控在无 NVMe 硬盘时误报 nvme0 的问题(glob 无匹配陷阱)
+- 修正 MAC 绑定接口名校验的错误提示文案
+
v11.0.0
- 交互层框架化:新增 lib/menu.sh,全部菜单迁移 run_menu,统一 EOF/Ctrl+C 守卫与 pause 节奏
- 确认体系两档成文:轻档 confirm_action / 重档 confirm_high_risk_action(指定确认词)
diff --git a/VERSION b/VERSION
index 275283a..68d8f15 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-11.0.0
+11.1.0
diff --git a/lib/CLAUDE.md b/lib/CLAUDE.md
index 35d9b4b..9dee16d 100644
--- a/lib/CLAUDE.md
+++ b/lib/CLAUDE.md
@@ -83,7 +83,7 @@
| `check_debug_mode()` | 解析 `--i-know-what-i-do` 和 `--debug` 参数 |
| `check_pve_version()` | PVE 版本检测(非 PVE9 环境需确认风险,拦截高危自动化) |
| `block_non_pve9_destructive()` | 非 PVE9 环境拦截换源/升级等破坏性操作 |
-| `show_menu()` | 主菜单(10 个功能入口 + 一言 Tips) |
+| `show_menu()` | 主菜单(11 个功能入口 + 一言 Tips) |
| `main()` | **脚本主入口**:trap INT(Ctrl+C 中断当前输入回上级而非杀进程)-> 权限/许可/调试/PVE 版本/网络检查 -> 更新检查 -> 主循环(read 带 EOF 守卫优雅退出;子菜单返回不重复 pause) |
## 关键依赖与配置
diff --git a/lib/config.sh b/lib/config.sh
index 2191bbf..11bfe17 100644
--- a/lib/config.sh
+++ b/lib/config.sh
@@ -3,7 +3,7 @@
# Copyright (C) 2026 Ciriu Networks
# 版本信息
-CURRENT_VERSION="11.0.0"
+CURRENT_VERSION="11.1.0"
BUILD_NICKNAME="Liino"
VERSION_FILE_URL="https://raw.githubusercontent.com/PVE-Tools/PVE-Tools-9/main/VERSION"
UPDATE_FILE_URL="https://raw.githubusercontent.com/PVE-Tools/PVE-Tools-9/main/UPDATE"
diff --git a/lib/runtime.sh b/lib/runtime.sh
index 7f75607..77a41e1 100644
--- a/lib/runtime.sh
+++ b/lib/runtime.sh
@@ -137,15 +137,14 @@ show_menu() {
show_menu_option "8" "诊断工具与项目信息 ${CYAN}( 系统信息 / 救砖 / 脚本管理 )${NC}"
show_menu_option "9" "安全中心 ${CYAN}( 风险检查 / SSH加固 / CVE修补 )${NC}"
show_menu_option "10" "第三方工具 ${CYAN}( CoolerControl / IT87驱动 / 社区脚本 )${NC}"
+ show_menu_option "11" "获取帮助 ${CYAN}( 联系作者 / 付费咨询 / 社区 )${NC}"
echo "$UI_DIVIDER"
show_menu_option "0" "${RED}退出脚本${NC}"
show_menu_footer
echo
echo -e " ${YELLOW}Tips: ${SESSION_TIP:-一言获取失败,本次会话不再重试。}${NC}"
- echo -e "本项目正在收集用户意见,如您愿意,请前往填写问卷,这能帮到整个项目!"
- echo -e "-> https://wj.qq.com/s2/27286538/9d9d/"
echo
- echo -ne " ${PRIMARY}请输入您的选择 [0-10]: ${NC}"
+ echo -ne " ${PRIMARY}请输入您的选择 [0-11]: ${NC}"
}
# 应急救砖工具箱菜单
main() {
@@ -212,6 +211,9 @@ main() {
10)
third_party_tools_menu
;;
+ 11)
+ help_center_menu
+ ;;
0)
echo "感谢使用,谢谢喵"
echo "再见!"
@@ -219,7 +221,7 @@ main() {
;;
*)
log_error "哎呀,这个选项不存在呢"
- log_warn "请输入 0-10 之间的数字"
+ log_warn "请输入 0-11 之间的数字"
;;
esac
diff --git a/src/CLAUDE.md b/src/CLAUDE.md
index 953c366..a2d0437 100644
--- a/src/CLAUDE.md
+++ b/src/CLAUDE.md
@@ -4,7 +4,7 @@
## 模块职责
-承载 PVE Tools Pro 全部业务逻辑,按主菜单编号拆分为 10 个子模块。每个子模块的 `init.sh` 为菜单入口函数,其余文件按功能领域进一步拆分。所有脚本由 `PVE-Tools.sh` 或 `dev.sh` 在 lib/ 加载完成后统一 source。
+承载 PVE Tools Pro 全部业务逻辑,按主菜单编号拆分为 11 个子模块。每个子模块的 `init.sh` 为菜单入口函数,其余文件按功能领域进一步拆分。所有脚本由 `PVE-Tools.sh` 或 `dev.sh` 在 lib/ 加载完成后统一 source。
## 入口与启动
@@ -28,6 +28,7 @@
| 8 | `08-tools-about/` | 诊断工具与项目信息 | 3 | 低 |
| 9 | `09-security/` | 安全中心 | 4 | 中等 |
| 10 | `10-third-party/` | 第三方工具 | 5 | 低 |
+| 11 | `11-help/` | 获取帮助 | 1 | 低 |
---
@@ -214,6 +215,19 @@
---
+## 11-help -- 获取帮助
+
+**菜单入口**: `help_center_menu()` 定义于 `init.sh`
+
+| 文件 | 核心函数 | 功能 |
+|---|---|---|
+| `init.sh` | `help_center_menu()` | 二级菜单 |
+| `info.sh` | `help_show_qq_group()`, `help_show_telegram_group()`, `help_show_paid_consult()` | 联系/付费咨询/社区信息展示 |
+
+**依赖**: 仅依赖 `lib/`(`show_menu_header` / `UI_DIVIDER` 展示组件)。
+
+---
+
## 关键依赖与配置
- **lib/ 先决条件**: 所有模块均依赖 `lib/config.sh`(全局变量)和 `lib/core.sh`(日志/UI/备份函数)
@@ -221,7 +235,7 @@
- `04-gpu-passthrough`: nvidia.sh 的辅助函数被 amd-*.sh 复用;iommu.sh 被多个子模块复用
- `05-vm-container`: storage-helper.sh 被 7 个同模块文件复用
- `06-networking`: interface.sh 被 6 个同模块文件复用
-- **无跨模块依赖**: 模块 01/02/03/07/08/09/10 仅依赖 lib/,不存在模块间引用
+- **无跨模块依赖**: 模块 01/02/03/07/08/09/10/11 仅依赖 lib/,不存在模块间引用
## 测试与质量
@@ -258,6 +272,7 @@ src/modules/
08-tools-about/ (3 文件) -- 诊断工具与项目信息
09-security/ (3 文件) -- 安全中心
10-third-party/ (4 文件) -- 第三方工具
+ 11-help/ (2 文件) -- 获取帮助
```
## 变更记录 (Changelog)
diff --git a/src/modules/01-optimization/cpupower.sh b/src/modules/01-optimization/cpupower.sh
index 3bc12f4..551e70e 100644
--- a/src/modules/01-optimization/cpupower.sh
+++ b/src/modules/01-optimization/cpupower.sh
@@ -327,6 +327,9 @@ EOF
log_info "检测系统中的 NVME 硬盘"
nvi=0
for nvme in /dev/nvme[0-9]; do
+ # 控制器节点为字符设备(如 /dev/nvme0,major 243),命名空间才是块设备(/dev/nvme0n1,不匹配本模式);
+ # 字符设备校验同时兼容 glob 无匹配场景(字面模式字符串非字符设备,自然跳过)
+ [ -c "$nvme" ] || continue
chmod +s /usr/sbin/smartctl 2>/dev/null
cat >> $tmpf << EOF
diff --git a/src/modules/04-gpu-passthrough/iommu.sh b/src/modules/04-gpu-passthrough/iommu.sh
index ddc70cd..35860ef 100644
--- a/src/modules/04-gpu-passthrough/iommu.sh
+++ b/src/modules/04-gpu-passthrough/iommu.sh
@@ -110,6 +110,34 @@ kvmgt"
log_info "/etc/modules 中已存在 vfio 模块,跳过。"
fi
+ # 可选增强:部分主板的 PCIe 拆分会将 GPU 与系统盘/NVMe 分到同一 IOMMU 组,
+ # GPU 直通时 vfio-pci 会误接管系统盘控制器导致开机崩溃;
+ # 常规单显卡直通不受影响,因此确认后由用户决定是否开启。
+ echo -e "${YELLOW}是否同时启用直通增强参数 iommu=pt 与 pcie_acs_override=downstream,multifunction?${NC}"
+ echo -e "${RED}仅在 GPU 与系统盘/NVMe 同属一个 IOMMU 组、GPU 直通时 vfio-pci 误接管系统盘导致开机崩溃的情况下建议开启;会强制拆分 IOMMU 组并开启直通模式,参数配置错误可能导致开机失败。${NC}"
+ if confirm_high_risk_action \
+ "写入直通增强参数 iommu=pt 与 pcie_acs_override=downstream,multifunction" \
+ "会修改 GRUB 内核参数并强制拆分 IOMMU 组、开启直通模式,需重启生效" \
+ "参数配置错误可能导致宿主机开机失败或 IOMMU 组隔离异常;非必要场景不建议开启" \
+ "脚本会自动备份 /etc/default/grub,可通过 GRUB 备份恢复功能回滚" \
+ "IOMMU-ENHANCE"; then
+ if grub_add_param "iommu=pt"; then
+ if ! grub_add_param "pcie_acs_override=downstream,multifunction"; then
+ # 回滚本次已成功写入的参数,避免留下半套配置
+ grub_remove_param "iommu=pt"
+ log_error "直通增强参数写入失败,已回滚本次写入,未应用更改"
+ return 1
+ fi
+ # 即使基础 IOMMU 参数已存在(grub_changed=0),本次新写入也必须触发 update-grub
+ grub_changed=1
+ else
+ log_error "直通增强参数 iommu=pt 写入失败,未应用更改"
+ return 1
+ fi
+ else
+ log_info "已跳过直通增强参数。若后续遇到 IOMMU 分组问题,可重新运行本菜单开启。"
+ fi
+
# 屏蔽核显/声卡驱动仅适用于"把核显直通给虚拟机"的场景;
# 宿主机还需要本地显示输出时开启会导致控制台黑屏,因此默认不开启。
# 设备级 vfio-pci ids 绑定由各显卡专用直通菜单按实际硬件写入,此处不再写死。
@@ -160,7 +188,11 @@ disable_pass() {
return 1
fi
- grub_remove_param "$iommu"
+ # 任一移除失败即中止,避免静默留下残留参数(未配置过的参数移除无副作用)
+ if ! grub_remove_param "$iommu" || ! grub_remove_param "iommu=pt" || ! grub_remove_param "pcie_acs_override"; then
+ log_error "GRUB 参数移除失败,请检查 /etc/default/grub 后重试"
+ return 1
+ fi
backup_file "/etc/modules"
# 先移除本工具的 marker 配置块,再精确清理历史版本写入的裸模块行(含 kvmgt,不误删其它行)
remove_block "/etc/modules" "IOMMU_BASE_MODULES"
diff --git a/src/modules/06-networking/mac-bind.sh b/src/modules/06-networking/mac-bind.sh
index a6d267a..5327da3 100644
--- a/src/modules/06-networking/mac-bind.sh
+++ b/src/modules/06-networking/mac-bind.sh
@@ -368,7 +368,7 @@ host_network_create_mac_binding() {
read -r -p "请输入固定接口名称(如 lan0、pve-eth0): " fixed_name
[[ -n "$fixed_name" ]] || { display_error "接口名称不能为空"; return 1; }
host_network_validate_systemd_link_name "$fixed_name" || {
- display_error "接口名称不合法: $fixed_name" "名称需为 1-15 位,只允许字母、数字、_、.、-,且不能是纯数字或保留名。"
+ display_error "接口名称不合法: $fixed_name" "名称需为 1-15 位,只允许字母、数字、下划线、点、连字符。且不能是纯数字或保留名。"
return 1
}
diff --git a/src/modules/11-help/info.sh b/src/modules/11-help/info.sh
new file mode 100644
index 0000000..bbd6a25
--- /dev/null
+++ b/src/modules/11-help/info.sh
@@ -0,0 +1,48 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0-only
+# Copyright (C) 2026 Ciriu Networks
+
+# 加 Q 群水群(闲聊交流为主,技术问题不保证有解答)
+help_show_qq_group() {
+ clear
+ show_menu_header "加 Q 群水群"
+
+ echo " 欢迎加入 PVE-Tools QQ 水群,与大家交流 PVE 玩法与踩坑经验。"
+ echo
+ echo " QQ 群号: ${CYAN}1031976463${NC}"
+ echo
+ echo -e "${YELLOW}提示:${NC} 本群以闲聊交流为主,技术问题不保证有解答;需要技术支持请前往付费咨询。"
+ echo "${UI_DIVIDER}"
+}
+
+# 加聊天社区咨询(Telegram 群,与 QQ 水群相互独立)
+help_show_telegram_group() {
+ clear
+ show_menu_header "加聊天社区咨询"
+
+ echo " 欢迎加入 PVE-Tools Telegram 聊天社区,与全球用户交流使用心得。"
+ echo
+ echo " Telegram 群: ${CYAN}https://t.me/pvetools233${NC}"
+ echo
+ echo -e "${YELLOW}提示:${NC} 本社区与 QQ 水群相互独立;技术问题不保证有解答,需要技术支持请前往付费咨询。"
+ echo "${UI_DIVIDER}"
+}
+
+# 加作者付费咨询(不提供免费技术支持,赞助入口一并展示)
+help_show_paid_consult() {
+ clear
+ show_menu_header "加作者付费咨询"
+
+ echo " 写脚本、维护项目需要时间和精力,这也是作者的饭碗。本工具免费开源,"
+ echo " 但一般不提供免费的技术支持和免费解答方案,感谢理解~"
+ echo
+ echo -e " ${RED}紧急情况 / 深度排查 / 谈合作:${NC}"
+ echo " QQ: 1520942621"
+ echo " 微信: kilomaple2024"
+ echo " Telegram: https://t.me/pvetools_bot"
+ echo " 邮件: contact@u3u.icu"
+ echo
+ echo " 想赞助作者:去官网支持一下,或直接加联系方式给作者转钱,感谢投喂!"
+ echo " 官网支持页: ${CYAN}https://pve.u3u.icu/support${NC}"
+ echo "${UI_DIVIDER}"
+}
diff --git a/src/modules/11-help/init.sh b/src/modules/11-help/init.sh
new file mode 100644
index 0000000..32f74cb
--- /dev/null
+++ b/src/modules/11-help/init.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-3.0-only
+# Copyright (C) 2026 Ciriu Networks
+
+# 获取帮助菜单
+help_center_menu() {
+ run_menu "获取帮助" help_center_menu_render help_center_menu_dispatch "0-3"
+}
+
+help_center_menu_render() {
+ show_menu_option "1" "加 Q 群水群 ${CYAN}(闲聊交流)${NC}"
+ show_menu_option "2" "加聊天社区咨询 ${CYAN}(Telegram 群)${NC}"
+ show_menu_option "3" "加作者付费咨询 ${CYAN}(一对一技术支持)${NC}"
+}
+
+help_center_menu_dispatch() {
+ case "$1" in
+ 1) help_show_qq_group ;;
+ 2) help_show_telegram_group ;;
+ 3) help_show_paid_consult ;;
+ *) return 1 ;;
+ esac
+ return 0
+}