如何在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
相关产品推荐
相关产品推荐

