基于变量值返回结果的最优方式?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
相关产品推荐
相关产品推荐

