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

Posted

技术标签:

【中文标题】随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择【英文标题】:Random word Bash script if a number is supplied as the first command line argument then it will select from only words with that many characters 【发布时间】:2017-05-28 04:38:18 【问题描述】:

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

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

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

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

【问题讨论】:

知道awk -v n=6 'length($0) == n' /usr/share/dict/words 只显示长度为 6 的单词会有帮助吗? 【参考方案1】:

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

#!/bin/bash

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

【讨论】:

【参考方案2】:

您必须使用 while 循环来读取该文件的每一行并检查单词的长度是否等于指定的数字(包括撇号)。在我的操作系统中,它是 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 命令将参数强制转换为整数,如果参数是 string ,则将其强制转换为数字 0 。因为如果指定的参数( number )是 0 (或强制为 0 的字符串)我们没有 0 个单词,则从函数返回。

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

【讨论】:

很奇怪,因为我正在关注的教程,只讨论了介绍和变量,现在让我执行这个任务。本教程稍后将讨论循环。没有while循环有没有办法做到这一点? 使用 awk?在 while 循环中使用 awk? 在 while 循环中使用 awk 来解决这个问题是多余的。但是你仍然可以使用 awk 来解决这个问题。既然你问“如何在 bash 中做到这一点”,你必须使用循环【参考方案3】:

不需要循环,你可以做类似的事情

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 等等。

【讨论】:

【参考方案4】:

这段代码可以实现你想要的:

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

一些 cmets:通过使用 "$RANDOM"(就像您在最初的脚本尝试中所做的那样),可以在 0 - 32767 范围内生成一个整数,该整数可能大于(或小于)给定单词上所需的字符数,可用的单词(行)数 - 因此,这里可能出现错误。

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

【讨论】:

以上是关于随机单词 Bash 脚本,如果提供一个数字作为第一个命令行参数,那么它将仅从具有那么多字符的单词中选择的主要内容,如果未能解决你的问题,请参考以下文章

带有带参数的函数的Bash脚本[重复]

bash脚本编程之数组及随机变量

简化bash脚本,以sudo身份运行时从命令中提取第一个单词

bash:部分匹配一个完整的单词

将我的 bash 脚本变成守护进程的选项

如何将库的 Python 函数作为 Bash 命令提供?