Bash 基于变量值返回结果的最佳方法是什么?
所以我想写一个小剧本。它在两个整数之间生成一个数字,然后基于该数字返回一个结果。我正试图决定写这篇文章的最佳方式是什么。我所能想到的就是对每个选项都执行if/then/else,所以看起来像这样:Bash 基于变量值返回结果的最佳方法是什么?,bash,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=$(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
除了工作脚本将有大约30倍的可能结果。以上只是我正在做的事情的一个简短版本,所以很清楚我在问什么。(无论如何,希望是清楚的)
这是可行的,但似乎必须有更好的办法。但事实上,数字和单词不是一一对应的(意思是,1=蓝色,但2-8是红色,38-49是棕色,而不是1=蓝色,2=红色,3=棕色等),这似乎很困难
是否有其他方法可以执行此操作?迭代排序数组,如
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
分支。当事情更复杂时,您可以用不同的方式表达它(例如,-
或完全省略它并选中$#
),并调整内部检查。使用具有适当范围检查的数组:
#!/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}"
#/usr/bin/env bash
颜色=([1]=“蓝色”[8]=“红色”[19]=“绿色”[37]=“粉色”[49]=“棕色”)
索引=(“${!颜色[@]}”)
滚动=$((随机%50+1))
结果=“范围内”
(滚动<索引[0]| |滚动>索引[-1])和结果=
对于${result:+“${index[@]}”中的num;做
((滚动)您缺少其他
,即黑色
案例。