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

Swi*_*ick 16 random bash shell

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

#!/bin/bash

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

print randomint(1,2,3)
Run Code Online (Sandbox Code Playgroud)

cod*_*ict 28

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

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

rand=$[ $RANDOM % 3 ]
echo ${arr[$rand]}
Run Code Online (Sandbox Code Playgroud)

从RANDOM的bash手册:

每次引用此参数时,都会生成0到32767之间的随机整数.可以通过向RANDOM赋值来初始化随机数序​​列.如果未设置RANDOM,即使随后重置,它也会失去其特殊属性.

  • $ []是兼容结构,支持1970年代的Bourne语法;在最近的标准中*未*发现该构造,因此不能保证除bash(历史上已包含它)以外的更现代的外壳支持该构造。自1991年POSIX sh发布以来,*标准*数学构造为$(()),因此应为rand = $((RANDOM%3))。 (3认同)

Cir*_*四事件 6

核心工具 shuf

存在于Coreutils 中,如果字符串不包含换行符,则此函数运行良好。

例如,从ab和中随机选择一个字母c

printf 'a\nb\nc\n' | shuf -n1
Run Code Online (Sandbox Code Playgroud)

POSIX eval 数组模拟 + RANDOM

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

a1=a
a2=b
a3=c
eval echo \$$(expr $RANDOM % 3 + 1)
Run Code Online (Sandbox Code Playgroud)

这仍然留下RANDOM非POSIX。

awk'srand()是解决这个问题的 POSIX 方法。


小智 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
}
Run Code Online (Sandbox Code Playgroud)

  • 我相信这并没有回答这个问题:OP希望从3个字符串中选择一个,而不是生成一个完全随机的字符串.并且`/ dev/random`对此更好. (4认同)