#!/data/data/com.termux/files/usr/bin/bash
# =============================================================
# qsb-tool.sh — 小米搜索(com.android.quicksearchbox) 引擎/跳转 一键工具
# 功能:
#   status            查看当前状态
#   engine <名称|URL> 把当前引擎槽位替换为指定搜索引擎（bing/baidu/360/douyin/sogou/google/自定义URL）
#   browser <名称>    修改跳转目标浏览器（via/chrome/edge），mi=恢复原版跳转逻辑
#   restore <目标>    回滚（engine=恢复引擎配置 browser=恢复原版APK all=全部）
#   refresh-backup    重新备份当前 APK（OTA 升级后执行）
# 无参数运行进入交互菜单。需要 root（KernelSU/Magisk）。
# =============================================================
set -u

TOOL_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
WORK="$TOOL_DIR/work"
ICONS="$TOOL_DIR/icons"
mkdir -p "$WORK"
# 内置必应图标（base64，单文件部署时用；icons/ 目录存在则优先）
ICON_B64="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAB60lEQVRYhe2WO5LTQBCGv57lAHZGoMABRYozaU0iRyRU7d6APYIpRUSWD2AvnAB8A8jI1kRGmW+AEuVLRqJpAsv27GK9KG058Z9oHj3Tn7rnJW8mbzmlzEm9nwHOAMCzpoYJUYjNr8FcAYOieYPoBjEzn3n6PwBStw0Toh7KFNVJ9Uz6sQC5bwNQmYKEqIe1q1rnACoTrN4lRL3OAFCmIK+c+gojY4z0fbMQjIyBpTNiiNppG4DSFCREA6z+cmhmvrmNj9ra9zHIwbGRsc981QSgPAI2PzgT+VLmHMA3tzHKwaHV6ybOqwEwh9DLgzAf14XMnNpVBwAMd4WG4dw45UEXAHs1Wdltt18TgNQpD8uMdkqIQqe6KbNrA/BtX8q1fmvZ/GZfFukAwMjXw4SEiY1KIbZ95p1jPyuzfayLF8HLox0e6zTTyz4QFE1hRjDI5PVvj3WaEPUyRkGWX35GuNkPVFa+WXxqClB5F2yPYr2jwRp4NG3sm3mjKFTuAp/5fXHc1v+RexChcVXKXJWmYCeP9R9P1t8zGS1R+kXz8+KbAkuMfPDNYpZpICBh0RdmOsKT9Y+q+Wuv47b6516oSUdtBNrKk5+rNpF4kifZ9uJS5681LrN9sjfhQwgtTUHna6CtTv4qPgOcAf4CS1CiUTfGv6sAAAAASUVORK5CYII="
PKG="com.android.quicksearchbox"
APK_BAK="/data/local/tmp/qsb_base.apk.bak"
WEB_BAK="/data/local/tmp/websearch_backup"
ICON_APP="/data/user/0/$PKG/files/qsb_engine_icon.png"
export JAVA_HOME="/data/data/com.termux/files/usr/lib/jvm/java-21-openjdk"

info() { echo "» $*"; }
ok()   { echo "✓ $*"; }
die()  { echo "✗ $*" >&2; exit 1; }

need_root() { su -c 'id -u' 2>/dev/null | grep -q '^0$' || die "需要 root 权限"; }
need_cmd()  { command -v "$1" >/dev/null 2>&1 || die "缺少命令: $1（pkg install $2）"; }

# ---------------- 引擎预设 ----------------
declare -A ENG_URL ENG_ZH ENG_TW ENG_EN
ENG_URL[bing]="https://cn.bing.com/search?q={searchTerms}"
ENG_ZH[bing]="必应";    ENG_TW[bing]="必應";    ENG_EN[bing]="Bing"
ENG_URL[baidu]="https://m.baidu.com/s?from=1013672g&word={searchTerms}&tn=ins&bd_ck=0&ex_bp_rt=1"
ENG_ZH[baidu]="百度";    ENG_TW[baidu]="百度";    ENG_EN[baidu]="Baidu"
ENG_URL[360]="https://m.so.com/s?q={searchTerms}&srcg=ff_xiaomi_1&nav=1&src=home"
ENG_ZH[360]="360";       ENG_TW[360]="360";       ENG_EN[360]="360 Search"
ENG_URL[douyin]="https://so.douyin.com/s?keyword={searchTerms}&query_correct_type=1&traffic_source=CS1111&original_source=3&in_tfs=XM&in_ogs=3&search_entrance=xiaomi&enter_method=normal_search"
ENG_ZH[douyin]="抖音搜索"; ENG_TW[douyin]="抖音搜尋"; ENG_EN[douyin]="Douyin Search"
ENG_URL[sogou]="https://m.sogou.com/web/searchList.jsp?keyword={searchTerms}"
ENG_ZH[sogou]="搜狗";    ENG_TW[sogou]="搜狗";    ENG_EN[sogou]="Sogou"
ENG_URL[google]="https://www.google.com/search?q={searchTerms}"
ENG_ZH[google]="Google";  ENG_TW[google]="Google";  ENG_EN[google]="Google"

# ---------------- 浏览器预设 ----------------
declare -A BRW_PKG
BRW_PKG[via]="mark.via"
BRW_PKG[chrome]="com.android.chrome"
BRW_PKG[edge]="com.microsoft.emmx"

# ---------------- 基础工具 ----------------
get_json_dirs() { su -c "ls -d /data/user/0/$PKG/files/data/websearch/websearch-*/ 2>/dev/null" | sed 's|/$||'; }
get_json_file() { get_json_dirs | head -1; }

get_apk_dir() {
  local p
  p=$(su -c "pm path $PKG" 2>/dev/null | sed 's/package://' | head -1)
  [ -n "$p" ] && dirname "$p" || echo ""
}

pull_app_file() {  # $1=源 $2=本地目标
  su -c "cat '$1'" > "$2" 2>/dev/null || die "读取失败: $1"
}

run_root_script() {  # $1=脚本文件
  su -c "sh '$1'" || die "root 脚本执行失败"
}

# ---------------- status ----------------
cmd_status() {
  need_root
  local SP="/data/user/0/$PKG/shared_prefs/searchEngine.xml"
  echo "===== 当前状态 ====="
  echo "--- SharedPreferences ---"
  su -c "cat '$SP'" 2>/dev/null | grep -E 'current_engine|engine_click_count|client_scene_info' | sed 's/^ *//'

  local JDIRS
  JDIRS=$(get_json_dirs)
  if [ -z "$JDIRS" ]; then
    echo "--- 引擎配置: 未找到 ---"
  else
    for JDIR in $JDIRS; do
      echo "--- 引擎配置: $JDIR ---"
      pull_app_file "$JDIR/searchengineNew.json" "$WORK/cur.json"
      python3 - "$WORK/cur.json" <<'PYEOF'
import json, sys
j = json.load(open(sys.argv[1], encoding='utf-8'))
for s, c in j['data']['searchEngineSceneMap'].items():
    print(f"  [{s}]")
    for e in c['searchEngines']:
        print(f"    {e['searchEngineName']:<8} {e['title_zh_CN']:<8} {e['searchUrl'][:60]}")
PYEOF
      echo "--- 保护状态 ---"
      su -c "lsattr '$JDIR/searchengineNew.json' '$JDIR' 2>/dev/null" | sed 's|^|  |'
    done
  fi
  echo "--- 图标缓存: $ICON_APP ---"
  su -c "lsattr '$ICON_APP' 2>/dev/null; md5sum '$ICON_APP' 2>/dev/null" | sed 's|^|  |'

  echo "--- APK 跳转目标 ---"
  local ADIR
  ADIR=$(get_apk_dir)
  if [ -n "$ADIR" ]; then
    pull_app_file "$ADIR/base.apk" "$WORK/cur.apk"
    local dexstr
    dexstr=$(unzip -p "$WORK/cur.apk" classes.dex 2>/dev/null | strings)
    if echo "$dexstr" | grep -q 'com.android.browser.fullsearch.FullSearchActivity'; then
      echo "  原版（跳 com.android.browser / Mi 浏览器）"
    elif echo "$dexstr" | grep -q 'mark\.via'; then
      echo "  桥接版 → mark.via (Via)"
    elif echo "$dexstr" | grep -q 'com\.microsoft\.emmx'; then
      echo "  桥接版 → com.microsoft.emmx (Edge)"
    elif echo "$dexstr" | grep -q 'com\.android\.chrome'; then
      echo "  桥接版 → com.android.chrome (Chrome)"
    else
      echo "  未知"
    fi
  else
    echo "  未找到 APK"
  fi
  echo "--- 备份 ---"
  su -c "ls -l '$APK_BAK' 2>/dev/null; ls -d '$WEB_BAK' 2>/dev/null" || echo "  （无）"
}

# ---------------- engine ----------------
cmd_engine() {
  need_root; need_cmd python3 python
  local eng="${1:-}"
  [ -z "$eng" ] && die "用法: $0 engine <bing|baidu|360|douyin|sogou|google|http(s)://...>"

  local JDIRS SP
  JDIRS=$(get_json_dirs); [ -z "$JDIRS" ] && die "找不到 websearch 配置目录"
  SP="/data/user/0/$PKG/shared_prefs/searchEngine.xml"

  # 解析引擎参数
  local url zh tw en icon=""
  if [[ "$eng" == http* ]]; then
    url="$eng"; zh="${eng#*://}"; zh="${zh%%/*}"; tw="$zh"; en="$zh"
  elif [ -n "${ENG_URL[$eng]:-}" ]; then
    url="${ENG_URL[$eng]}"; zh="${ENG_ZH[$eng]}"; tw="${ENG_TW[$eng]}"; en="${ENG_EN[$eng]}"
  else
    die "未知引擎: $eng（可选: bing baidu 360 douyin sogou google 或自定义 http(s) URL）"
  fi

  # 当前槽位
  pull_app_file "$SP" "$WORK/sp.xml"
  local slot
  slot=$(grep -o 'name="current_engine">[^<]*' "$WORK/sp.xml" | sed 's/.*>//')
  [ -z "$slot" ] && slot="baidu"
  info "当前槽位: $slot → 目标引擎: $zh ($url)"

  # 拉取 JSON 并修改（以第一个目录为模板）
  local first_dir
  first_dir=$(echo "$JDIRS" | head -1)
  pull_app_file "$first_dir/searchengineNew.json" "$WORK/eng.json"
  local app_icon="file://$ICON_APP"
  [ -f "$ICONS/$eng.png" ] || app_icon=""
  python3 - "$WORK/eng.json" "$WORK/eng.new.json" "$slot" "$url" "$zh" "$tw" "$en" "$app_icon" <<'PYEOF'
import json, sys
src, dst, slot, url, zh, tw, en, icon = sys.argv[1:9]
j = json.load(open(src, encoding='utf-8'))
n = 0
for scene, cfg in j['data']['searchEngineSceneMap'].items():
    for e in cfg['searchEngines']:
        if e['searchEngineName'] == slot:
            e['searchUrl'] = url
            e['title_zh_CN'] = zh
            e['title_zh_TW'] = tw
            e['title_en_US'] = en
            if icon:
                e['iconUrl'] = icon
            else:
                e['iconUrl'] = ""
            n += 1
if n == 0:
    print("ERR: 槽位 %s 不在引擎列表中" % slot, file=sys.stderr); sys.exit(1)
json.dump(j, open(dst, 'w', encoding='utf-8'), ensure_ascii=False, separators=(',', ':'))
print("已修改 %d 个场景条目" % n)
PYEOF
  [ $? -eq 0 ] || die "JSON 修改失败"

  # 图标部署标记
  local icon_cp=""
  local icon_src="$ICONS/$eng.png"
  if [ ! -f "$icon_src" ] && [ "$eng" = "bing" ] && [ -n "$ICON_B64" ]; then
    printf '%s' "$ICON_B64" | base64 -d > "$WORK/bing_icon.png" 2>/dev/null || python3 -c "import base64,sys;sys.stdout.buffer.write(base64.b64decode(sys.argv[1]))" "$ICON_B64" > "$WORK/bing_icon.png"
    icon_src="$WORK/bing_icon.png"
  fi
  [ -f "$icon_src" ] && icon_cp="yes"

  # 生成 root 脚本（部署到所有 websearch-* 目录并全部加锁）
  local dirlist
  dirlist=$(echo "$JDIRS" | tr '\n' ' ')
  cat > "$WORK/root_engine.sh" <<EOF
#!/system/bin/sh
P=/data/user/0/$PKG
am force-stop $PKG
sleep 1
# 动态获取 app uid（不同设备 uid 不同）
PKG_UID=\$(stat -c %u "\$P" 2>/dev/null || echo 0)
PKG_GID=\$(stat -c %g "\$P" 2>/dev/null || echo 0)
N=0
for D in $dirlist; do
  J="\$D/searchengineNew.json"
  [ -f "\$J" ] || continue
  chattr -i "\$J" 2>/dev/null
  chattr -i "\$D" 2>/dev/null
  cp "$WORK/eng.new.json" "\$J" 2>/dev/null || cat "$WORK/eng.new.json" > "\$J" 2>/dev/null
  chown \$PKG_UID:\$PKG_GID "\$J"; chmod 600 "\$J"; restorecon "\$J" 2>/dev/null
  chattr +i "\$J" 2>/dev/null
  chattr +i "\$D" 2>/dev/null
  N=\$((N+1))
done
if [ "$icon_cp" = "yes" ]; then
  chattr -i "$ICON_APP" 2>/dev/null
  cp "$icon_src" "$ICON_APP"
  chown \$PKG_UID:\$PKG_GID "$ICON_APP"; chmod 644 "$ICON_APP"; restorecon "$ICON_APP" 2>/dev/null
  chattr +i "$ICON_APP" 2>/dev/null
fi
echo "engine deployed to \$N dirs"
EOF
  if [ "${DRY_RUN:-0}" = "1" ]; then
    info "DRY_RUN: 跳过部署，root 脚本见 $WORK/root_engine.sh"
    return 0
  fi
  run_root_script "$WORK/root_engine.sh"
  ok "搜索引擎已切换为 $zh（槽位 $slot，已部署全部 websearch 目录），请重新打开搜索验证"
}

# ---------------- browser ----------------
cmd_browser() {
  need_root; need_cmd apktool apktool; need_cmd python3 python
  local brw="${1:-}"
  [ -z "$brw" ] && die "用法: $0 browser <via|chrome|edge|mi>"

  local ADIR
  ADIR=$(get_apk_dir); [ -z "$ADIR" ] && die "找不到 APK 目录"

  # mi = 恢复原版
  if [ "$brw" = "mi" ]; then
    su -c "test -f '$APK_BAK'" || die "备份不存在: $APK_BAK"
    cat > "$WORK/root_browser.sh" <<EOF
#!/system/bin/sh
am force-stop $PKG
sleep 1
cp "$APK_BAK" "$ADIR/base.apk"
chown system:system "$ADIR/base.apk"; chmod 644 "$ADIR/base.apk"; restorecon "$ADIR/base.apk" 2>/dev/null
rm -rf "$ADIR/oat"
echo "original apk restored"
EOF
    run_root_script "$WORK/root_browser.sh"
    ok "已恢复原版 APK（跳 com.android.browser）"
    return 0
  fi

  [ -n "${BRW_PKG[$brw]:-}" ] || die "未知浏览器: $brw（可选: via chrome edge mi）"
  local target="${BRW_PKG[$brw]}"

  # 备份
  if ! su -c "test -f '$APK_BAK'"; then
    info "创建 APK 备份..."
    su -c "cp '$ADIR/base.apk' '$APK_BAK' && chmod 644 '$APK_BAK'"
  fi
  pull_app_file "$APK_BAK" "$WORK/base.apk"

  # 反编译 → 替换 c() → 重打包
  cd "$WORK" || die "cd 失败"
  rm -rf qsb_d qsb_new.apk
  info "反编译 smali..."
  apktool d -f --no-res base.apk -o qsb_d >/dev/null 2>&1 || die "apktool d 失败"
  # 自动定位跳转类（不同版本混淆名不同：V2/n1、U2/k1 等）
  local jcls
  jcls=$(grep -rl "FullSearchActivity" qsb_d/smali*/ 2>/dev/null | head -1)
  [ -n "$jcls" ] || die "未找到 FullSearchActivity 所在类（版本不兼容，请 refresh-backup 后重试）"
  info "跳转类: ${jcls#qsb_d/}"

  python3 - "$jcls" "$target" <<'PYEOF'
import re, sys
p, pkg = sys.argv[1], sys.argv[2]
s = open(p, encoding='utf-8').read()
sig5 = r'\.method public static c\(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;\)V'
sig4 = r'\.method public static c\(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;Ljava/util/HashMap;\)V'
m5 = re.search(sig5 + r'.*?^\.end method', s, re.S | re.M)
m4 = re.search(sig4 + r'.*?^\.end method', s, re.S | re.M)
m = m5 or m4
if not m:
    print("ERR: 未找到 c() 方法（版本变化，请 refresh-backup）", file=sys.stderr)
    sys.exit(1)
body = m.group(0)
if 'com.android.browser' not in body and 'FullSearchActivity' not in body:
    print("ERR: c() 方法不是原版结构", file=sys.stderr)
    sys.exit(1)
new = '''.method public static c(Landroid/content/Context;Landroid/content/Intent;Ljava/lang/String;Ljava/lang/String;Ljava/util/HashMap;)V
    .locals 3

    if-eqz p2, :cond_0

    :try_start_0
    invoke-static {p2}, Landroid/net/Uri;->parse(Ljava/lang/String;)Landroid/net/Uri;
    move-result-object v0

    new-instance v1, Landroid/content/Intent;
    const-string v2, "android.intent.action.VIEW"
    invoke-direct {v1, v2, v0}, Landroid/content/Intent;-><init>(Ljava/lang/String;Landroid/net/Uri;)V

    const-string v0, "PKGNAME"
    invoke-virtual {v1, v0}, Landroid/content/Intent;->setPackage(Ljava/lang/String;)Landroid/content/Intent;

    const/high16 v0, 0x10000000
    invoke-virtual {v1, v0}, Landroid/content/Intent;->addFlags(I)Landroid/content/Intent;

    invoke-virtual {p0, v1}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V
    :try_end_0
    .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

    :cond_0
    return-void

    :catch_0
    move-exception v0
    return-void
.end method'''.replace('PKGNAME', pkg)
s2 = s[:m.start()] + new + s[m.end():]
open(p, 'w', encoding='utf-8').write(s2)
print("c() 替换完成 →", pkg)
PYEOF
  [ $? -eq 0 ] || die "smali 替换失败"

  info "重打包..."
  apktool b qsb_d -o qsb_new.apk >/dev/null 2>&1 || die "apktool b 失败"
  # 修复 apktool b 丢资源：从原备份补回缺失的 res 文件
  info "补全资源（apktool b 会丢部分 res）..."
  python3 - "qsb_new.apk" "$APK_BAK" <<'PYEOF2'
import zipfile, sys
target, orig = sys.argv[1], sys.argv[2]
try:
    zt = zipfile.ZipFile(target)
    zo = zipfile.ZipFile(orig)
    has = set(zt.namelist())
    missing = [n for n in zo.namelist() if n.startswith("res/") and n not in has]
    if missing:
        with zipfile.ZipFile(target, "a") as z:
            for n in missing:
                z.writestr(n, zo.read(n))
        print(f"补充 {len(missing)} 个 res 文件")
    else:
        print("资源完整，无需补充")
except Exception as e:
    print("WARN: 资源补全失败:", e)
PYEOF2
  local cnt
  cnt=$(unzip -p qsb_new.apk classes.dex | strings | grep -c "$target")
  [ "$cnt" -ge 1 ] || die "验证失败: dex 中未找到 $target"

  # 部署
  cat > "$WORK/root_browser.sh" <<EOF
#!/system/bin/sh
am force-stop $PKG
sleep 1
cp "$WORK/qsb_new.apk" "$ADIR/base.apk"
chown system:system "$ADIR/base.apk"; chmod 644 "$ADIR/base.apk"; restorecon "$ADIR/base.apk" 2>/dev/null
rm -rf "$ADIR/oat"
echo "browser deployed"
EOF
  if [ "${DRY_RUN:-0}" = "1" ]; then
    info "DRY_RUN: 跳过部署，产物见 $WORK/qsb_new.apk"
    return 0
  fi
  run_root_script "$WORK/root_browser.sh"
  ok "跳转目标已改为 $target（$brw），请重新打开搜索验证"
}

# ---------------- restore ----------------
cmd_restore() {
  need_root
  local what="${1:-all}"
  local ADIR
  ADIR=$(get_apk_dir)

  if [ "$what" = "engine" ] || [ "$what" = "all" ]; then
    if su -c "test -d '$WEB_BAK'"; then
      local JDIR
      JDIR=$(get_json_file)
      cat > "$WORK/root_restore_engine.sh" <<EOF
#!/system/bin/sh
P=/data/user/0/$PKG
am force-stop $PKG
sleep 1
PKG_UID=\$(stat -c %u "\$P" 2>/dev/null || echo 0)
PKG_GID=\$(stat -c %g "\$P" 2>/dev/null || echo 0)
[ -n "$JDIR" ] && { chattr -i "$JDIR/searchengineNew.json" 2>/dev/null; chattr -i "$JDIR" 2>/dev/null; }
cp -a $WEB_BAK/. /data/user/0/$PKG/files/data/websearch/ 2>/dev/null
if [ -n "$JDIR" ]; then
  chown -R \$PKG_UID:\$PKG_GID "$JDIR"; restorecon -R "$JDIR" 2>/dev/null
fi
echo "engine restored"
EOF
      run_root_script "$WORK/root_restore_engine.sh"
      ok "引擎配置已从备份恢复"
    else
      die "引擎备份不存在: $WEB_BAK"
    fi
  fi

  if [ "$what" = "browser" ] || [ "$what" = "all" ]; then
    [ -z "$ADIR" ] && die "找不到 APK 目录"
    if su -c "test -f '$APK_BAK'"; then
      cat > "$WORK/root_restore_apk.sh" <<EOF
#!/system/bin/sh
am force-stop $PKG
sleep 1
cp "$APK_BAK" "$ADIR/base.apk"
chown system:system "$ADIR/base.apk"; chmod 644 "$ADIR/base.apk"; restorecon "$ADIR/base.apk" 2>/dev/null
rm -rf "$ADIR/oat"
echo "apk restored"
EOF
      run_root_script "$WORK/root_restore_apk.sh"
      ok "APK 已从备份恢复"
    else
      die "APK 备份不存在: $APK_BAK"
    fi
  fi
}

# ---------------- refresh-backup ----------------
cmd_refresh_backup() {
  need_root
  local ADIR
  ADIR=$(get_apk_dir); [ -z "$ADIR" ] && die "找不到 APK 目录"
  su -c "cp '$ADIR/base.apk' '$APK_BAK' && chmod 644 '$APK_BAK'"
  ok "APK 备份已更新: $APK_BAK"
}

# ---------------- 交互菜单 ----------------
menu() {
  echo "========================================"
  echo " 小米搜索 引擎/跳转 一键工具"
  echo "========================================"
  echo " 1) 切换搜索引擎（当前槽位）"
  echo " 2) 修改跳转浏览器"
  echo " 3) 查看状态"
  echo " 4) 回滚引擎配置"
  echo " 5) 回滚 APK（恢复原版）"
  echo " 6) 刷新 APK 备份"
  echo " 0) 退出"
  read -rp "选择: " c
  case "$c" in
    1) read -rp "引擎名/URL (bing/baidu/360/douyin/sogou/google/URL): " e; cmd_engine "$e" ;;
    2) read -rp "浏览器 (via/chrome/edge/mi): " b; cmd_browser "$b" ;;
    3) cmd_status ;;
    4) cmd_restore engine ;;
    5) cmd_restore browser ;;
    6) cmd_refresh_backup ;;
    0) exit 0 ;;
    *) echo "无效选择" ;;
  esac
  echo
  menu
}

# ---------------- 入口 ----------------
case "${1:-menu}" in
  status)          cmd_status ;;
  engine)          cmd_engine "${2:-}" ;;
  browser)         cmd_browser "${2:-}" ;;
  restore)         cmd_restore "${2:-all}" ;;
  refresh-backup)  cmd_refresh_backup ;;
  menu)            menu ;;
  help|-h|--help)
    sed -n '2,11p' "$0" | sed 's/^# //' ;;
  *) echo "未知参数: $1"; sed -n '2,11p' "$0" | sed 's/^# //' ;;
esac
