我试图在bash中获取随机数组 我使用了以下代码:
agents=$(shuf $DISTR)
case $DISTR in
"1")
echo "amos"
;;
"2")
echo "dia"
;;
"3")
echo "dia lagi"
;;
esac
echo "$agents"
但是我得到了空白的结果。 任何人都可以帮助我吗?
我希望输出是其中一种情况
答案 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
...
我们可能会打印first
或1st
,但绝不会second
或2nd
。
如果您只对一个随机条目感兴趣,那么对整个数组进行洗牌是很多工作。以原始顺序读取数组并选择随机索引会更快。
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