所以我有一个我想写的小脚本。它在两个整数之间生成一个数字,然后根据该数字返回一个结果。我正在试图确定实际写这个的最佳方法是什么。我能想到的就是为每个选项做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 =布朗,等),似乎可能很难。
我应该采取不同的方式吗?
答案 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
(这是可能的最高输入值)。当事情变得更复杂时,您可以用不同的方式表达它(例如-
或完全省略它并检查$#
)并调整内部检查。