如何从案例中获取随机数组

时间:2017-04-04 21:20:47

标签: bash

我试图在bash中获取随机数组 我使用了以下代码:

agents=$(shuf $DISTR)
    case $DISTR in 
        "1")
            echo "amos"
    ;;
        "2")
            echo "dia"
    ;;
        "3")
            echo "dia lagi"
    ;;
esac

echo "$agents"

但是我得到了空白的结果。 任何人都可以帮助我吗?

我希望输出是其中一种情况

2 个答案:

答案 0 :(得分:0)

要使用bash生成随机数,请使用$ RANDOM内部Bash函数。请注意,$ RANDOM不应用于生成加密密钥。 $ RANDOM是使用您当前的进程ID(PID)和自1970年以来经过的秒数定义的当前时间/日期生成的。

$(( ( RANDOM % 10 )  + 3 ))

答案 1 :(得分:0)

假设

$DISTR是非空文件的路径。

修复现有代码

agents=($(shuf "$DISTR")) # create shuffled array
echo "${agents[0]}"       # print the first entry

第一个条目是随机条目,因为数组被洗牌。

请注意,此解决方案仅适用于每行一个字(无空格)的文件。如果一行包含多个单词,则在行重排后,每个单词将存储在单独的数组条目中。对于带有

行的文件
...
first second
1st 2nd
...

我们可能会打印first1st,但绝不会second2nd

更好的解决方案

如果您只对一个随机条目感兴趣,那么对整个数组进行洗牌是很多工作。以原始顺序读取数组并选择随机索引会更快。

mapfile agents "$DISTR"            # create array
length=${#agents[@]}               
randomIndex=$(( RANDOM % length )) # random number between 0 and length-1
echo "${agents[randomIndex]}"      

或简而言之

mapfile agents "$DISTR"
echo "${agents[RANDOM % ${#agents[@]}]}"

RANDOM是一个内置变量/函数返回一个伪随机数(不用于加密等)。 mapfile每个数组条目存储一行,即使这些行包含空格。

最佳解决方案

我们再做了太多工作。当我们只选择一个随机行时,为什么要将整个文件读入数组? (XY problem的典型情况)。

shuf -n 1 "$DISTR" # print one random line