Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 基于变量值返回结果的最佳方法是什么?_Bash - Fatal编程技术网

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

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 [

所以我想写一个小剧本。它在两个整数之间生成一个数字,然后基于该数字返回一个结果。我正试图决定写这篇文章的最佳方式是什么。我所能想到的就是对每个选项都执行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
除了工作脚本将有大约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;做

((滚动)您缺少
其他
,即
黑色
案例。