在Bash脚本中随机选取并打印三个字符串中的一个

时间:2011-03-04 05:05:04

标签: bash shell random

如何打印值1,2或3(随机)。我最好的猜测失败了:

#!/bin/bash

1 = "2 million"
2 = "1 million"
3 = "3 million"

print randomint(1,2,3)

5 个答案:

答案 0 :(得分:27)

要使用bash生成随机数,请使用$RANDOM内部Bash函数:

arr[0]="2 million"
arr[1]="1 million"
arr[2]="3 million"

rand=$[ $RANDOM % 3 ]
echo ${arr[$rand]}

来自RANDOM的bash手册:

  

每次参数都是   引用,0之间的随机整数   并生成32767。序列   可以初始化随机数   通过为RANDOM赋值。如果   RANDOM没有设置,它失去了它   特殊属性,即使它是   随后重置。

答案 1 :(得分:5)

64个字符数字字符串

randomString32() {
    index=0
    str=""

    for i in {a..z}; do arr[index]=$i; index=`expr ${index} + 1`; done
    for i in {A..Z}; do arr[index]=$i; index=`expr ${index} + 1`; done
    for i in {0..9}; do arr[index]=$i; index=`expr ${index} + 1`; done
    for i in {1..64}; do str="$str${arr[$RANDOM%$index]}"; done

    echo $str
}

答案 2 :(得分:3)

如果字符串不包含换行符,

shuf from Coreutils效果很好:

printf 'a\nb\nc\n' | shuf -n1

POSIX eval数组仿真+ RANDOM

修改Marty的eval技术来模拟数组(非POSIX):

a1=a
a2=b
a3=c
eval echo \$$(expr $RANDOM % 3 + 1)

这仍然留下RANDOM非POSIX。

awk' rand()是一种POSIX解决方法。

答案 3 :(得分:1)

~.$ set -- "First Expression" Second "and Last"
~.$ eval echo \$$(expr $RANDOM % 3 + 1)
and Last
~.$ 

答案 4 :(得分:0)

想使用不错的shuf方法在coreutils中使用-n1 -e进行确认。

示例用法,从值abc中随机选择:

CHOICE=$(shuf -n1 -e a b c)
echo "choice: $CHOICE"

我查看了两个样本大小(1000和10000)的余额:

$ for lol in $(seq 1000); do shuf -n1 -e a b c; done > shufdata
$ less shufdata | sort | uniq -c
    350 a
    316 b
    334 c
$ for lol in $(seq 10000); do shuf -n1 -e a b c; done > shufdata
$ less shufdata | sort | uniq -c
   3315 a
   3377 b
   3308 c

参考:https://www.gnu.org/software/coreutils/manual/html_node/shuf-invocation.html