linux 如何修复bash脚本以从字典中查找随机单词?

xmd2e60i  于 2022-12-18  发布在  Linux
关注(0)|答案(5)|浏览(114)

我正在学习bash脚本,我被困在修复这个网站的练习:https://ryanstutorials.net/bash-scripting-tutorial/bash-variables.php#activities
任务是编写一个bash脚本,从字典中输出一个随机单词,其长度等于作为第一个命令行参数提供的数字。
我的想法是创建一个子字典,为每个单词分配一个数字行,从这些行中选择一个随机数并过滤输出,这对类似的简单脚本有效,但对这个脚本无效。
这是我使用的代码:

6 DIC='/usr/share/dict/words'
  7 SUBDIC=$( egrep '^.{'$1'}$' $DIC )
  8 
  9 MAX=$( $SUBDIC | wc -l )
 10 RANDRANGE=$((1 + RANDOM % $MAX))
 11 
 12 RWORD=$(nl "$SUBDIC" | grep "\b$RANDRANGE\b" | awk '{print $2}')
 13 
 14 echo "Random generated word from $DIC which is $1 characters long:" 
 15 echo $RWORD

这是我输入“21”时得到的错误:

bash script.sh 21
script.sh: line 9: counterintelligence's: command not found
script.sh: line 10: 1 + RANDOM % 0: division by 0 (error token is "0")
nl: 'counterintelligence'\''s'$'\n''electroencephalograms'$'\n''electroencephalograph': No such file or directory
Random generated word from /usr/share/dict/words which is 21 characters long:

我尝试在bash中将代码分成更小的部分,没有发现错误(input=21):

egrep '^.{'21'}$' /usr/share/dict/words | wc -l
3

但在脚本第9和10行中给予一次错误。
你认为错误在哪里?

qxgroojn

qxgroojn1#

个问题

  1. SUBDIC=$( egrep '^.{'$1'}$' $DIC )会将所有给定长度的单词存储在SUBDIC变量中,因此它的内容现在类似于foo bar baz
  2. MAX=$( $SUBDIC | ... )将尝试运行命令foo bar baz,这显然是伪造的;它应该更像MAX=$(echo $SUBDIC | ... )
  3. MAX=$( ... | wc -l )将对 * 行 * 进行计数;当使用上面提到的echo $SUBDIC时,您将有多个单词,但都在一行中...
  4. RWORD=$(nl "$SUBDIC" | ...)与上面相同的问题:只有一行(还请注意@armali的回答,即nl需要一个文件或stdin)
  5. RWORD=$(... | grep "\b$RANDRANGE\b" | ...)可能与字典条目catch 22匹配
  6. RWORD=$(... | awk '{print $2}')可能不会处理包含空格的行

简单的解决方案

对所有可能的单词进行“随机排序”并取第一行就足够了:

egrep "^.{$1}$" "${DIC}"  | sort -R | head -1
h7appiyu

h7appiyu2#

  • MAX=$( $SUBDIC | wc -l )-管道用于连接命令的输出,而$SUBDIC不是命令;适当的语法是MAX=$( <<<$SUBDIC wc -l )
  • nl "$SUBDIC"-nl的参数必须是文件名,而"$SUBDIC"不是;适当的语法是nl <<<"$SUBDIC"
k5hmc34c

k5hmc34c3#

这段代码可以做到这一点。我的测试字典在文件file中。首先获取给定长度的所有单词,但将它们放在一个数组中,而不是var中,这是一个好主意。然后获取一个随机索引并回送它。

dic=( $(sed -n "/^.\{$1\}$/p" file) )
ind=$((0 + RANDOM % ${#dic[@]}))
echo ${dic[$ind]}
m0rkklqb

m0rkklqb4#

我也在做这个活动,我创建了一个简单的解决方案。
我创建脚本。

#!/bin/bash

awk "NR==$1 {print}" /usr/share/dict/words

在这里,如果你想要一个随机字符串,那么你必须按照下面的命令从终端运行脚本。

./script.sh $RANDOM

如果你想打印任何特定的数字串,那么你可以从终端按照下面的命令运行。

./script.sh 465

s1ag04yj

s1ag04yj5#

cat /usr/share/dict/american-english | head -n $RANDOM | tail -n 1
$RANDOM-每次引用时返回一个不同的随机数。这行代码输出上述字典中的随机词。
否则,作为umläute mentined你可以做:
cat /usr/share/dict/american-english | sort -R | head -1

相关问题