我的脚本在使用 $RANDOM 时产生相同的输出

Kar*_*ngh 8 bash random

我试图打印一个随机n字母单词,我n从命令行本身输入,但由于某种原因,我的脚本每次使用相同的值时都会给我相同的答案n

#!/bin/bash                                                                                                                                       
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1
Run Code Online (Sandbox Code Playgroud)

我将我的脚本称为:

$ bash var3.sh 5
étude             # always the same output when using 5 

$ bash var3.sh 3
zoo               # always the same output when using 3
Run Code Online (Sandbox Code Playgroud)

哪里var3.sh是我的脚本名称,5 是我想随机打印的单词的长度。

我如何让它打印一个真正随机的单词?

小智 20

它没有。但是 $RANDOM 返回大数字(0 到 32767 之间),特别是对于长度有限的单词,它显示相同的结果,因为该head部分可能返回 grep 的所有结果(对于 3, my 中只有 819 个匹配项/usr/share/dict/words)。

更好的解决方案可能是对结果进行洗牌:

egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1

where-R表示--random-sort(GNUsort扩展)。

  • 为什么是“尾巴”?这在 OP 的脚本中是有道理的,但既然你在改组,你也可以使用 `head`,然后 `sort` 应该能够检测到损坏的管道,而不必费心改组其余的行。 (16认同)

Fox*_*Fox 19

打印任意num字母单词的简单方法使用shuf

egrep "^.{$num}$" /usr/share/dict | shuf -n1
Run Code Online (Sandbox Code Playgroud)

shuf命令输出输入的随机排列,-n1标志告诉它只输出这个结果的第一项。

  • 或`grep -Ex ".{$num}"`。或者`awk 'length == n' n="$num"'`。 (3认同)

Kus*_*nda 5

正如其他人指出的那样,您的代码的主要问题是,$RANDOM它的值通常比特定长度的单词数大得多。

awk仅使用:

$ awk -v len="$num" 'length == len { word[i++]=$0 }
                     END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac
Run Code Online (Sandbox Code Playgroud)

程序从给定文件中读取所有具有特定长度的行。这些存储在数组中words

最后,从该数组中选择并打印一个随机元素。