【发布时间】:2020-05-29 08:11:10
【问题描述】:
我正在学习 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 行出现错误。
你认为错误在哪里?
【问题讨论】:
-
在
$SUBDIC中,您正在存储实际单词(egrep命令的输出),但随后您尝试执行这些单词($( $SUBDIC) ... -
如果您有 GNU (Linux),请考虑
grep -E "^.{$1}$" /usr/share/dict/words |shuf -n1,如果运行 BSD/Mac,请考虑grep -E "^.{$1}$" /usr/share/dict/words |sort -R |head -n1。