在Bash脚本中随机选择并打印三个字符串中的一个
如何打印值,1、2或3(随机)。我最好的猜测失败了:在Bash脚本中随机选择并打印三个字符串中的一个,bash,shell,random,Bash,Shell,Random,如何打印值,1、2或3(随机)。我最好的猜测失败了: #!/bin/bash 1 = "2 million" 2 = "1 million" 3 = "3 million" print randomint(1,2,3) 要使用bash生成随机数,请使用$random内部bash函数: arr[0]="2 million" arr[1]="1 million" arr[2]="3 million" rand=$[ $RANDOM % 3 ] echo ${arr[$rand]} 从bas
#!/bin/bash
1 = "2 million"
2 = "1 million"
3 = "3 million"
print randomint(1,2,3)
要使用bash生成随机数,请使用
$random
内部bash函数:
arr[0]="2 million"
arr[1]="1 million"
arr[2]="3 million"
rand=$[ $RANDOM % 3 ]
echo ${arr[$rand]}
从bash手册中随机选择:
每次启用此参数时
引用,0之间的随机整数
生成了32767。序列
一组随机数可以初始化
通过将值赋给“随机”。如果
“随机”是未设置的,它失去了它的属性
特殊属性,即使是
随后重置
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
}
Coreutils
shuf
如中所示,如果字符串不包含换行符,则此函数可以正常工作
例如,从a
、b
和c
中随机选取一个字母:
printf 'a\nb\nc\n' | shuf -n1
POSIX评估阵列仿真+随机
修改Marty的eval
技术以模拟阵列(非POSIX):
这仍然使随机
非POSIX
awk
的rand()
是一种POSIX方法来解决这个问题。想使用nice-n1-e
方法从coreutils使用shuf
来证实这一点
~.$ set -- "First Expression" Second "and Last"
~.$ eval echo \$$(expr $RANDOM % 3 + 1)
and Last
~.$
示例用法,用于在值a
、b
、c
中随机选取:
printf 'a\nb\nc\n' | shuf -n1
CHOICE=$(shuf-n1-eabbc)
回声“选择:$choice”
我查看了两种样品尺寸(1000和10000)的天平:
Ref:最小的问题是:从
{1,2,3}
+数组中选择一个整数来解决这个问题。那些1=“200万”
行应该是什么意思?它们不是有效的bash构造。我相信这并不能回答问题:OP希望从3个字符串中选择一个,而不是生成一个完全随机的字符串。而/dev/random
更适合这样做;linux?我在MacOSX上看不到它,而且阵列非常难看。见下文answer@MartyMcGowanGNU非POSIX作为链接。同意数组是丑陋的,但shuf的第一个选项不使用数组。同意更大的可移植性是很酷的。我不知道set
可以像你建议的那样设置参数,这很有趣。$[]
是一个支持1970年代伯恩语法的兼容性构造;这种构造在最新的标准中找不到,因此不能保证由除bash(历史上包括它)之外的更现代的shell支持。自1991年POSIX sh发布以来,标准化的数学结构一直是$(())
,因此这应该是rand=$((随机%3))
。我还建议引用--echo“${arr[$rand]}”
;这样,我们就不会在IFS中使用不同的值,或者使用扩展为全局的数组值时出现意外行为。(例如,如果IFS=0123456789
,那么没有引号的echo${arr[$rand}
根本不会打印任何数字)。为了避免硬编码3,rand=$[$RANDOM%${arr[@]}如何?
$ 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