You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Bash 4.1中用关联数组实现按主机类型统计软件版本次数

解决Bash 4.1下按主机类型统计软件版本次数的问题

我会帮你写出list_versions.sh脚本,同时拆解每一步的逻辑,确保在Bash 4.1环境下能稳定运行。

脚本实现

#!/bin/bash

# 先检查Bash版本,确保支持关联数组(Bash 4.0+特性)
if [[ ${BASH_VERSINFO[0]} -lt 4 ]]; then
    echo "错误:需要Bash 4.0或更高版本才能运行此脚本" >&2
    exit 1
fi

# 定义关联数组存储统计结果,键格式为「主机类型:软件名:版本号」,值为使用次数
declare -A version_stats

# 遍历所有匹配hostname_*.txt的文件
for file in hostname_*.txt; do
    # 跳过不存在的文件(避免没有匹配文件时触发错误)
    [[ -f "$file" ]] || continue

    # 用awk解析文件内容,提取关键信息并输出标准化格式
    awk '{
        host_type = $2
        softA_ver = $4
        softB_ver = $6
        print host_type ":SoftA:" softA_ver
        print host_type ":SoftB:" softB_ver
    }' "$file" | while read -r stat_key; do
        # 对每个统计项计数自增
        ((version_stats["$stat_key"]++))
    done
done

# 整理并格式化输出统计结果
# 第一步:收集所有唯一的主机类型
declare -A unique_types
for key in "${!version_stats[@]}"; do
    current_type=${key%%:*}  # 拆分键,取第一个部分(主机类型)
    unique_types["$current_type"]=1
done

# 按主机类型排序后逐个输出
for type in $(printf "%s\n" "${!unique_types[@]}" | sort); do
    echo "=== 主机类型: $type ==="
    echo "SoftA 版本统计:"
    # 筛选当前类型下的SoftA条目,排序后输出
    for key in $(printf "%s\n" "${!version_stats[@]}" | grep "^$type:SoftA:" | sort); do
        ver=${key##*:}  # 拆分键,取最后一个部分(版本号)
        count=${version_stats["$key"]}
        echo "  $ver: $count 次"
    done
    echo "SoftB 版本统计:"
    # 筛选当前类型下的SoftB条目,排序后输出
    for key in $(printf "%s\n" "${!version_stats[@]}" | grep "^$type:SoftB:" | sort); do
        ver=${key##*:}
        count=${version_stats["$key"]}
        echo "  $ver: $count 次"
    done
    echo  # 空行分隔不同主机类型的统计结果
done

脚本关键逻辑说明

  1. 版本兼容性检查:先验证Bash版本,避免低版本环境因不支持关联数组而报错。
  2. 关联数组设计:用主机类型:软件名:版本号作为唯一键,确保每个统计项不会冲突。
  3. 文件解析:借助awk快速提取固定位置的字段,避免手动拆分字符串的繁琐。
  4. 结果整理:先收集所有主机类型,排序后逐个输出对应软件的版本统计,保证输出结构清晰。

示例使用效果

假设你有以下几个测试文件:

  • hostname_web01.txt内容:host_type type_web SoftA version123 SoftB version456
  • hostname_app01.txt内容:host_type type_app SoftA version123 SoftB version789
  • hostname_web02.txt内容:host_type type_web SoftA version456 SoftB version456

运行./list_versions.sh后,输出会是:

=== 主机类型: type_app ===
SoftA 版本统计:
  version123: 1 次
SoftB 版本统计:
  version789: 1 次

=== 主机类型: type_web ===
SoftA 版本统计:
  version123: 1 次
  version456: 1 次
SoftB 版本统计:
  version456: 2 次

注意事项

  • 确保目标文件的内容格式严格匹配示例:每行只有一条记录,字段顺序固定。
  • 如果文件包含多行记录,脚本也能自动遍历处理。
  • 脚本会自动对主机类型和版本号排序,输出结果更规整。

内容的提问来源于stack exchange,提问作者F4240

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:39:20