随机单词Bash脚本如果提供一个数字作为第一个命令行参数,那么它将只选择具有那么多字符的单词

时间:2017-01-12 22:10:32

标签: bash random centos6

我正在尝试创建一个Bash脚本 - 打印一个随机单词 - 如果提供了一个数字作为第一个命令行参数,那么它将只选择具有那么多字符的单词。

这是我在第一部分(打印一个随机单词):

C=$(sed -n "$RANDOM p" /usr/share/dict/words)
echo $C

我真的被第二部分困住了。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:0)

你必须使用while循环来读取该文件的每一行,并检查一个单词的长度是否等于指定的数字(包括撇号)。在我的o.s中它是99171行(即文件)。

#!/usr/bin/env bash
 readWords() {
    declare -i int="$1"

    (( int == 0 )) && {
       printf "%s\n" "$int is 0, cant find 0 words"
       return 1
    }

    while read getWords;do
       if [[ ${#getWords} -eq $int ]];then
         printf "%s\n" "$getWords"
       fi
   done < /usr/share/dict/words
}

readWords 20

此函数只接受一个参数。 declare命令将参数强制转换为整数,如果参数是字符串,则将其强制转换为0。因为如果指定的参数(数字)为0(或者字符串被强制为0),我们没有0个单词从函数返回。

读取/ usr / share / dict / words中的每一行,用${#getWords}获取每一行的长度($#&gt;&gt;给出字符串/命令行参数/数组的长度size)检查它是否等于指定的参数(数字)

答案 1 :(得分:0)

此代码可实现您的目标:

awk -v n="$1" 'length($0) == n' /usr/share/dict/words > /tmp/wordsHolder
shuf -n 1 /tmp/wordsHolder

一些评论:通过使用"$RANDOM"(就像您在原始脚本尝试中所做的那样),可以生成0 - 32767范围内的整数,这可能更多(给定一个单词所需的字符数,可以比可用的单词(行数)更少 - 因此,这里可能存在错误。

为了避免这种情况,我们使用shuf语法,使用其整个范围(来自line 1 - last line of file)检索文件上的(子)随机选取的单词(行)。

答案 2 :(得分:0)

不需要循环,您可以执行类似

的操作
CH=$1; # how many characters the word must have
WordFile=/usr/share/dict/words; # file to read from
# find how many words that matches that length
TOTW=$(grep -Ec "^.{$CH}$" $WordFile);
# pick a random one, if you expect more than 32767 hits you
#  need to do something like ($RANDOM+1)*($RANDOM+1)
RWORD=$(($RANDOM%$TOTW+1));
#show that word
grep -E "^.{$CH}$" $WordFile|sed -n "$RWORD p"

根据您可能需要添加支票的内容,例如$ 1是合理的数字,文件存在,TOTW> 0等等。

答案 3 :(得分:0)

可能会帮助来自ryans教程的人

#!/bin/bash

charlen=$1
grep -E "^.{$charlen}$" $PWD/words.txt | shuf -n 1