我正在学习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行中给予一次错误。
你认为错误在哪里?
5条答案
按热度按时间qxgroojn1#
个问题
SUBDIC=$( egrep '^.{'$1'}$' $DIC )
会将所有给定长度的单词存储在SUBDIC
变量中,因此它的内容现在类似于foo bar baz
。MAX=$( $SUBDIC | ... )
将尝试运行命令foo bar baz
,这显然是伪造的;它应该更像MAX=$(echo $SUBDIC | ... )
MAX=$( ... | wc -l )
将对 * 行 * 进行计数;当使用上面提到的echo $SUBDIC
时,您将有多个单词,但都在一行中...RWORD=$(nl "$SUBDIC" | ...)
与上面相同的问题:只有一行(还请注意@armali的回答,即nl
需要一个文件或stdin)RWORD=$(... | grep "\b$RANDRANGE\b" | ...)
可能与字典条目catch 22
匹配RWORD=$(... | awk '{print $2}')
可能不会处理包含空格的行简单的解决方案
对所有可能的单词进行“随机排序”并取第一行就足够了:
h7appiyu2#
MAX=$( $SUBDIC | wc -l )
-管道用于连接命令的输出,而$SUBDIC
不是命令;适当的语法是MAX=$( <<<$SUBDIC wc -l )
。nl "$SUBDIC"
-nl
的参数必须是文件名,而"$SUBDIC"
不是;适当的语法是nl <<<"$SUBDIC"
。k5hmc34c3#
这段代码可以做到这一点。我的测试字典在文件
file
中。首先获取给定长度的所有单词,但将它们放在一个数组中,而不是var中,这是一个好主意。然后获取一个随机索引并回送它。m0rkklqb4#
我也在做这个活动,我创建了一个简单的解决方案。
我创建脚本。
在这里,如果你想要一个随机字符串,那么你必须按照下面的命令从终端运行脚本。
如果你想打印任何特定的数字串,那么你可以从终端按照下面的命令运行。
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