AI重写脚本

📅 2026/6/30 3:19:17
AI重写脚本
标准化重写脚本遵循 Google Shell 规范高可读、健壮、可直接上线#!/usr/bin/env bash# # 脚本名称: EncodingConversion.sh# 功能: 批量转换目录下文件名编码GBK - UTF-8依赖convmv工具# 入参说明:# $1 源编码(必填) 例: GBK / GB2312# $2 目标编码(必填) 例: UTF-8# $3 待转换目录(必填) 绝对路径# 使用示例:# bash EncodingConversion.sh GBK UTF-8 /data/download# 版本: v1.0# 日期: 2026-06-29# set-oerrexit# 任意命令失败直接退出脚本set-onounset# 使用未定义变量直接报错退出set-opipefail# 管道命令中间失败也判定为失败# -------------------------- 全局常量定义 --------------------------# 彩色输出常量RED\033[0;31mGREEN\033[0;32mYELLOW\033[1;33mNC\033[0m# No Color# -------------------------- 工具函数定义 --------------------------## 函数1: 检测外网连通性# 返回值: 0网络正常 1无外网check_network(){# 优先检测80端口TCP连通(规避ICMP ping封禁)ifcurl-s--connect-timeout3www.baidu.com/dev/null21;thenecho-e${GREEN}[OK] 外网网络连通正常${NC}return0fi# 备用检测公共DNS 53端口ifnc-zv-w3223.5.5.553/dev/null21;thenecho-e${YELLOW}[WARN] 网络可达但网页访问异常(DNS正常)${NC}return0fiecho-e${RED}[ERROR] 服务器无法连接外网无法在线安装软件${NC}return1}## 函数2: 自动安装convmv工具install_convmv(){echo-e${YELLOW}[INFO] 未检测到convmv开始自动安装...${NC}# root环境不使用sudo非root自动追加sudolocalSUDOif[[$(id-u)-ne0]];thenSUDOsudofiifcommand-vdnf/dev/null;then${SUDO}dnf-yinstallconvmvelifcommand-vyum/dev/null;then${SUDO}yum-yinstallconvmvelifcommand-vapt/dev/null;then${SUDO}aptupdate-y/dev/null21${SUDO}apt-yinstallconvmvelifcommand-vapt-get/dev/null;then${SUDO}apt-getupdate-y/dev/null21${SUDO}apt-get-yinstallconvmvelseecho-e${RED}[ERROR] 未识别支持的包管理器(yum/dnf/apt)请手动安装convmv${NC}exit2fiecho-e${GREEN}[OK] convmv 安装完成${NC}}## 函数3: 获取用户y/n确认输入# 参数: $1 提示文本# 返回值: 0输入y/Y确认 1输入n/N取消get_yes_no_input(){localprompt_text$1localuser_inputwhiletrue;doread-p${prompt_text}user_inputcase${user_input}iny|Y)return0;;n|N)return1;;*)echo-e${YELLOW}[WARN] 输入无效仅允许输入 y 或 n请重新输入${NC};;esacdone}## 函数4: 统一封装文件名转换逻辑消除重复代码# 参数: $1源编码 $2目标编码 $3目录 $4是否真实转换(空预览 --notest真实执行)run_convmv(){localsrc_enc$1localdst_enc$2localtarget_dir$3localreal_exec$4convmv-f${src_enc}-t${dst_enc}-r${real_exec}${target_dir}}# -------------------------- 主业务入口 --------------------------main(){# 1. 校验入参数量if[[-z$1||-z$2||-z$3]];thenecho-e${YELLOW}[USAGE] bash$0源编码 目标编码 待转换目录${NC}echo-e${YELLOW}[EXAMPLE] bash$0GBK UTF-8 /data/download${NC}exit1fi# 入参赋值语义化变量localSRC_ENC$1localDST_ENC$2localTARGET_DIR$3# 2. 校验目标目录是否存在if[[!-d${TARGET_DIR}]];thenecho-e${RED}[ERROR] 目标目录不存在:${TARGET_DIR}${NC}exit2fi# 3. 检测并安装convmvif[[-z$(command-vconvmv)]];thencheck_network install_convmvfi# 4. 打印任务信息echoecho-e源文件编码:${YELLOW}${SRC_ENC}${NC}echo-e目标文件编码:${GREEN}${DST_ENC}${NC}echo-e待处理目录:${TARGET_DIR}echoecho-e${YELLOW}[STEP1] 预览转换计划(仅展示不会修改文件)${NC}run_convmv${SRC_ENC}${DST_ENC}${TARGET_DIR}# 5. 用户确认是否真实转换ifget_yes_no_input[CONFIRM] 是否执行真实文件名转换?(y/n): ;thenecho-e${GREEN}[STEP2] 开始执行文件名编码转换...${NC}run_convmv${SRC_ENC}${DST_ENC}${TARGET_DIR}--notestecho-e${GREEN}[SUCCESS] 全部文件编码转换完成${NC}elseecho-e${YELLOW}[INFO] 用户取消转换操作脚本退出${NC}exit0fi}# 启动主函数接收外部全部参数main$语法规范问题影响阅读 极易触发 bug所有变量引用未加双引号convmv -f $1 -t $2 -r $3如果目录 / 编码带空格、特殊字符会直接拆分参数脚本崩溃规范写法必须 “$1” “$2” “$3”。if [ -z $(command -v convmv) ] 单括号内部命令替换无引号输出含空格会报语法错误推荐 [[ -z “$(command -v convmv)” ]]。函数内部无 local 局部变量所有变量全局污染多人维护易出现变量覆盖。代码缩进不统一部分区块无分层长代码阅读吃力。结构可读性缺陷缺少头部文档注释无脚本用途、入参说明、作者、版本隔一段时间再看无法快速看懂脚本作用。无统一入口 main 函数代码从上到下平铺执行函数定义和业务执行混杂逻辑流向不直观。关键逻辑无注释网络检测、安装、预览转换、真实转换四大核心流程没有分段注释。命令缺少静默抑制nc -zv、curl 会输出大量冗余日志干扰用户阅读关键提示。健壮性 体验缺陷间接降低使用可读性安装 convmv 时强制加sudo但脚本本身已经 root 执行时会报 sudo 找不到适配性差。未校验目标目录是否真实存在传入不存在路径时 convmv 会抛出晦涩报错没有友好提示。没有错误退出机制命令执行失败不会终止脚本会继续向下执行造成误操作。预览转换和真实转换分离太远两段重复的convmv命令修改一处要同步改两处维护成本高。细节体验问题输出文字无分层分隔大量日志挤在一起用户难以区分提示 / 报错 / 执行信息。缺少彩色输出警告、成功、错误信息视觉无区分。#!/bin/bash# 示例: sudo bash EncodingConversion.sh GBK UTF-8 /data/if[[-z$1||-z$2||-z$3]];thenechoecho用法sudobashEncodingConversion.sh 源编码 目标编码 待转换目录echo示例sudobashEncodingConversion.sh GBK UTF-8 /data/downloadexit2fi# 定义函数# 一键判断服务器是否能访问外网check_network(){# 优先用curl检测TCP 80兼容性最强ifcurl-s--connect-timeout3www.baidu.com/dev/null;thenecho外网联网正常return0fi# curl失败则测试DNS端口连通ifnc-zv-w3223.5.5.553/dev/null;thenecho 网络通但网页访问异常DNS正常return0fiecho服务器无法连接外网return1}# 安装软件convmv_install(){ifcommand-vyum/dev/null;thensudoyum-yinstallconvmvelifcommand-vdnf/dev/null;thensudodnf-yinstallconvmvelifcommand-vapt/dev/null;thensudoapt-yinstallconvmvelifcommand-vapt-get/dev/null;thensudoapt-get-yinstallconvmvfi}# 函数获取用户y/n输入返回0确认y1取消nget_yes_no_input(){localprompt$1localinputwhiletrue;doread-p$promptinputcase$inputiny|Y)return0;;n|N)return1;;*)echo输入无效请仅输入 y 或 n;;esacdone}if[-z$(command-vconvmv)];thenecho未安装convmv命令check_network convmv_installficonvmv-f$1-t$2-r$3ifget_yes_no_input确认执行文件名转码(y/n);thenecho开始转换...convmv-f$1-t$2-r--notest$3elseecho操作取消退出脚本exit0fi