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

如何在Bash中基于主机名子串优雅地实现变量值设置?

优化Bash根据主机名设置内存变量的方案

针对当前用多个[[ =~ ]]正则匹配设置memory变量的冗余问题,这里提供几个更简洁易维护的优化方案:

方案1:关联数组集中管理规则

把匹配正则和对应内存配置存入关联数组,通过循环遍历完成匹配,新增规则只需添加数组元素,无需重复编写判断语句:

hostname=$(hostname -s)

# 定义服务正则与内存的映射关系
declare -A service_memory=(
    ["(^|^mngmnt)presto[[:digit:]]+$"]="23G"
    ["(^|^mngmnt)hadoop[[:digit:]]+$"]="12G"
    ["(^|^mngmnt)kafka[[:digit:]]+$"]="10G"
)

# 遍历规则匹配主机名
for pattern in "${!service_memory[@]}"; do
    if [[ $hostname =~ $pattern ]]; then
        memory=${service_memory[$pattern]}
        break  # 匹配到即退出,避免后续规则覆盖
    fi
done

方案2:预处理主机名后用case判断

先通过sed提取纯服务类型(去掉前缀mngmnt和末尾数字),再用原生case语句匹配,执行效率高且代码直观:

hostname=$(hostname -s)

# 提取服务标识:移除开头的mngmnt前缀和末尾的数字后缀
service=$(echo "$hostname" | sed -E 's/^mngmnt//; s/[0-9]+$//')

# 用case设置对应内存
case $service in
    presto) memory=23G ;;
    hadoop) memory=12G ;;
    kafka) memory=10G ;;
    # 新增服务直接添加分支即可
esac

方案3:用awk一次性完成匹配赋值

借助awk的正则匹配能力,把匹配和输出内存值合并为单行命令,适合简单场景:

memory=$(hostname -s | awk '
    /(^|^mngmnt)presto[0-9]+$/ {print "23G"}
    /(^|^mngmnt)hadoop[0-9]+$/ {print "12G"}
    /(^|^mngmnt)kafka[0-9]+$/ {print "10G"}
')

方案选择建议

  • 若规则频繁变动、需要灵活扩展,优先选关联数组方案;
  • 若追求执行效率和代码可读性,推荐预处理+case方案;
  • 简单场景下,awk方案更简洁。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:30:06