``` #字体颜色 HL='\033[37;1m' RED='\033[31;1m' GREEN='\033[32;1m' YELLOW='\033[33;1m' BLUE='\033[34;1m' PURPLE='\033[35;1m' AZURE='\033[36;1m' END='\033[0m' listfile="/root/hostinfo.list" # 检查是否以root身份运行 if [[ $EUID -ne 0 ]]; then echo "此脚本必须以root权限运行!" exit 1 fi if [[ -n $1 ]] && [[ ! -f $1 ]];then Hosts_list=$(cat ${listfile}|grep -w ${1^^}|egrep -v '^#|^$'|awk '{print $2}'); fi if [[ -n ${Hosts_list} ]];then for Hip in ${Hosts_list} ;do Bk_type=$(cat ${listfile}|grep -w ${Hip}|egrep -v '^#|^$'|awk '{print $1}'); echo -e "${GREEN}连接${RED} ${Hip} ${GREEN}中......!${END}" case ${Bk_type} in ORACLE) scp /yum_kms/work/orabbix/scripts/*.sh $Hip:/app/zabbix/orabbix/scripts/; ;; MONGO) scp /yum_kms/work/mongodb/*.sh $Hip:/app/zabbix/mongodb/ ;; esac echo -e "${GREEN}已在${RED} ${Hip} ${GREEN}上完成脚本同步!${END}\n"; done else echo -e "${RED}\$1 输入错误!${END}\n"; ```
时间: 2025-03-25 22:28:09 浏览: 22
### 优化说明
在原始代码中存在一些可以改进的地方:
1. **重复逻辑提取**:多次读取文件内容并执行相同的过滤操作(如 `grep` 和 `awk`),可以通过一次性加载数据来减少冗余。
2. **变量命名规范性**:部分变量名不够直观,例如 `Hip` 可以改为更语义化的名称。
3. **输入参数校验增强**:增加对 `$1` 参数的空值检查和类型验证。
4. **日志输出标准化**:将日志信息统一处理,便于后续扩展或替换为其他日志系统。
5. **Shell 脚本性能优化**:避免不必要的子shell调用,提升效率。
以下是优化后的完整代码:
---
### 优化后代码
```bash
#!/bin/bash
# 字体颜色定义
HL='\033[37;1m' # 高亮
RED='\033[31;1m' # 红色
GREEN='\033[32;1m' # 绿色
YELLOW='\033[33;1m' # 黄色
BLUE='\033[34;1m' # 蓝色
PURPLE='\033[35;1m' # 紫色
AZURE='\033[36;1m' # 天蓝色
END='\033[0m' # 结束符
HOST_INFO_FILE="/root/hostinfo.list" # 主机列表文件路径
# 日志打印函数
log() {
local color=$1
shift
echo -e "${color}$*${END}"
}
# 检查是否以 root 权限运行
if [[ $EUID -ne 0 ]]; then
log "$RED" "此脚本必须以 root 权限运行!"
exit 1
fi
# 校验传入参数
if [[ -z "$1" || "$1" =~ ^\s*$ ]]; then
log "$RED" "\$1 参数为空!请输入有效的主机标识符。"
exit 1
fi
INPUT_HOST="${1^^}" # 将输入转换为大写形式
# 加载主机配置到内存数组 (一次读取即可)
declare -A HOST_MAP=()
while IFS=' ' read -r type ip rest; do
if [[ -n "$type" && "$type" != "#" ]]; then
HOST_MAP["$ip"]="$type"
fi
done < "$HOST_INFO_FILE"
# 查找匹配的主机 IP 列表
MATCHED_IPS=($(echo "${!HOST_MAP[@]}" | tr ' ' '\n' | grep -w "$INPUT_HOST"))
# 如果未找到匹配项,则提示错误
if [[ ${#MATCHED_IPS[@]} -eq 0 ]]; then
log "$RED" "\$1 输入错误! 找不到与之匹配的主机记录。"
exit 1
fi
# 同步脚本到目标主机
for TARGET_IP in "${MATCHED_IPS[@]}"; do
BK_TYPE=${HOST_MAP[$TARGET_IP]}
log "$GREEN" "正在连接至主机: ${RED}${TARGET_IP}${GREEN}..."
case "$BK_TYPE" in
ORACLE)
scp /yum_kms/work/orabbix/scripts/*.sh "${TARGET_IP}":/app/zabbix/orabbix/scripts/
;;
MONGO)
scp /yum_kms/work/mongodb/*.sh "${TARGET_IP}":/app/zabbix/mongodb/
;;
*)
log "$YELLOW" "[警告]: 不支持的类型 (${BK_TYPE}),跳过主机(${TARGET_IP})"
continue
;;
esac
log "$GREEN" "已完成主机[${RED}${TARGET_IP}${GREEN}]上的脚本同步。\n"
done
```
---
### 优化点详解
1. **字典结构存储映射关系**
使用 Bash 的关联数组 (`declare -A`) 存储主机及其类型的对应关系,减少了反复从文件中查找的时间开销。
2. **集中化日志管理**
提供了通用的日志打印函数 `log()`,使得不同级别的消息输出更加清晰且易于维护。
3. **正则表达式简化条件判断**
在检测用户输入时直接通过正则排除空白字符串的情况,并将其转为大写以便精确匹配。
4. **减少命令嵌套层级**
原始版本中有大量管道传递的操作被替代成先缓存再筛选的方式,从而降低复杂度同时提高可读性和调试便利程度。
5. **新增异常分支处理机制**
对于未知类型的备份任务增加了 fallback 支持,默认会给出警告但不会中断整个流程。
以上改动不仅提升了代码性能还增强了其健壮性以及未来扩展能力。
阅读全文
相关推荐














