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

基于变量值返回结果的最优方式?Shell多区间匹配脚本优化问询

嘿,你的这个问题我太有共鸣了——当区间数量多到30个的时候,一堆if/elif堆起来不仅看着头疼,后续改起来也超级麻烦。这里有几个更优雅的替代方案,你可以根据自己的实际场景选:

方案1:用关联数组维护区间映射

这个方案的核心是把「区间上限→对应结果」的映射存在数组里,然后按从小到大的顺序遍历区间上限,找到第一个符合条件的就输出。最大的好处是维护成本极低,新增或修改区间只需要改数组内容,完全不用碰逻辑代码。

#!/bin/bash

# 定义区间上限和对应结果的映射
declare -A result_map=(
    [1]="BLUE"
    [8]="RED"
    [19]="GREEN"
    [37]="PINK"
    [49]="BROWN"
    [50]="BLACK"
)

# 对区间上限进行从小到大排序,保证判断顺序正确
sorted_limits=($(echo "${!result_map[@]}" | tr ' ' '\n' | sort -n))

# 生成随机数
ROLL=$(shuf -i 1-50 -n 1)

# 遍历匹配区间
for limit in "${sorted_limits[@]}"; do
    if (( ROLL <= limit )); then
        echo "${result_map[$limit]}"
        exit 0
    fi
done

方案2:用awk处理区间匹配

awk天生擅长处理数值区间判断,代码逻辑会非常直观,可读性拉满。如果你的脚本可以依赖awk(绝大多数Linux系统都默认带),这个方案会很舒服。

#!/bin/bash

ROLL=$(shuf -i 1-50 -n 1)

echo "$ROLL" | awk '
    $1 == 1          { print "BLUE"   }
    $1 >= 2 && $1 <=8   { print "RED"    }
    $1 >=9 && $1 <=19   { print "GREEN"  }
    $1 >=20 && $1 <=37  { print "PINK"   }
    $1 >=38 && $1 <=49  { print "BROWN"  }
    $1 ==50          { print "BLACK"  }
'

方案3:用数组下标直接映射(适合规整区间)

如果你的区间都是连续的数值范围,可以直接用数组下标对应随机数,取值时一步到位,性能最优。缺点是需要提前填充数组,但对于30个区间来说,写几个循环就能搞定。

#!/bin/bash

# 初始化结果数组
declare -a results

# 逐个填充区间对应的结果
results[1]="BLUE"
for i in {2..8}; do results[$i]="RED"; done
for i in {9..19}; do results[$i]="GREEN"; done
for i in {20..37}; do results[$i]="PINK"; done
for i in {38..49}; do results[$i]="BROWN"; done
results[50]="BLACK"

# 生成随机数并输出结果
ROLL=$(shuf -i 1-50 -n 1)
echo "${results[$ROLL]}"

方案对比

  • 追求易维护:选关联数组方案,新增区间只加一行数组定义就行
  • 追求代码简洁:选awk方案,区间判断逻辑一目了然
  • 追求执行速度:选数组下标方案,直接通过索引取值,没有循环判断开销

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:35:50