基于变量值返回结果的最佳方法是什么?

时间:2018-01-13 23:28:13

标签: bash

所以我有一个我想写的小脚本。它在两个整数之间生成一个数字,然后根据该数字返回一个结果。我正在试图确定实际写这个的最佳方法是什么。我能想到的就是为每个选项做if / then / else,所以它看起来像这样:

ROLL=$(shuf -i 1-50 -n 1)
if [ "$ROLL" -eq "1" ];then
echo BLUE
elif [ "$ROLL" -le "8" ];then
echo RED
elif [ "$ROLL" -le "19" ];then
echo GREEN
elif [ "$ROLL" -le "37" ];then
echo PINK
elif [ "$ROLL" -le "49" ];then
echo BROWN
else
echo BLACK
fi

除了工作脚本将有大约三十倍的可能结果。以上只是我正在做的缩短版本所以我很清楚我在问什么。 (无论如何,希望清楚)

这样可行,但似乎必须有更好的方法去做。但是数字和单词不是一对一匹配的事实(意思是,1 =蓝色,但2-8是红色,38-49是布朗,而不是1 =蓝色,2 =红色,3 =布朗,等),似乎可能很难。

我应该采取不同的方式吗?

2 个答案:

答案 0 :(得分:2)

使用具有适当范围检查的数组:

#!/usr/bin/env bash

colors=( [1]="BLUE" [8]="RED" [19]="GREEN" [37]="PINK" [49]="BROWN" )
indexes=( "${!colors[@]}" )
roll=$((RANDOM % 50 + 1))

result="in range"
(( roll < indexes[0] || roll > indexes[-1] )) && result=

for num in ${result:+"${indexes[@]}"}; do
    (( roll <= num )) && { result="${colors[num]}"; break; }
done

echo "${result:=BLACK}"

检查卷筒是否落在正确的范围内。如果它大于最后一个数字 OR 小于第一个数字,则输出BLACK

答案 1 :(得分:0)

迭代排序的数组,如

COLORS=(
   "1  BLUE"
   "8  RED"
   "19 GREEN"
   # ...
   "50 BLACK"
)

for c in "${COLORS[@]}"; do
    set -- $c
    test "$ROLL" -le $1 || continue
    echo "$2"
    break
done

代码使用50分支的else(这是可能的最高输入值)。当事情变得更复杂时,您可以用不同的方式表达它(例如-或完全省略它并检查$#)并调整内部检查。