首页 > 解决方案 > 如何遍历 Bash 中的单词列表?

问题描述

#!/bin/bash
input="usr/share/dict/words"
while IFS= read -r line
do
     if [[ ${line:0:1} == "a" ]]
          then
          key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"
          if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
               then
               echo "$line"
          fi
     fi
done < "$input"

这就是我目前所参加的课程的内容。说明是编写一个简短的 Bash 脚本,逐行读取单词列表,过滤掉任何不以字母“a”开头的单词,然后运行以查看任何给定单词的输出是否与我们为图像whiskey.jpg 给出的所需摘要匹配,因为其中一个单词是它的关键。

过滤以“a”开头的单词的比较语句可以正常运行并将它们打印出来,但是我过去从未使用过 bash 脚本,所以我不确定在尝试运行每一行时我做错了什么/单词通过以找到匹配的输出。现在它似乎无限期地直到我退出它,没有可见的输出。

标签: bash

解决方案


这里有几个问题。按顺序,从第二行开始:

input="usr/share/dict/words"

由于此路径不以“/”开头,因此将被视为相对于当前目录。在前面添加一个“/”。下一个:

key="$(openssl dgst -sha1 -hmac '$line' whiskey.jpg)"

在这里,单引号'$line'防止变量被扩展(它只是被视为文字字符串)。请改用双引号。请注意,通常引号不会嵌套——也就是说,在另一个双引号字符串中没有双引号字符串这样的东西——但在这种情况下$( )会创建一个新的引用上下文,因此嵌套是有效的。下一个:

if [[ $key == "G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]

这里的 shell 语法很好,问题是$key类似于“HMAC-SHA1(whiskey.jpg)= G11a600a8dad2Gb98f18cefec4315a6c92777292”,比较字符串只匹配它的结尾。但是在里面[[ ]]==操作符可以做通配符比较,所以加一个通配符:if [[ $key == *"G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]

最后,脚本在找到匹配项后不会退出,它会搜索单词文件的其余部分以寻找更多匹配项。因此,在找到匹配项exit后添加。echo

以下是这些修复的结果:

#!/bin/bash
input="/usr/share/dict/words"
while IFS= read -r line
do
     if [[ ${line:0:1} == "a" ]]
          then
          key="$(openssl dgst -sha1 -hmac "$line" whiskey.jpg)"
          if [[ $key == *"G11a600a8dad2Gb98f18cefec4315a6c92777292" ]]
               then
               echo "$line"
               exit
          fi
     fi
done < "$input"

顺便说一句,对脚本有用的故障排除技术:让shellcheck.net扫描您的脚本以查找常见错误(它在此处发现单引号问题),并将其放在set -x不起作用的部分之前,因此 shell 将打印它认为正在发生的事情在脚本运行时开启。您会看到如下内容:

++ openssl dgst -sha1 -hmac '$line' whiskey.jpg
+ key='HMAC-SHA1(whiskey.jpg)= G11a600a8dad2Gb98f18cefec4315a6c92777292'
+ [[ HMAC-SHA1(whiskey.jpg)= G11a600a8dad2Gb98f18cefec4315a6c92777292 == \G\1\1\a\6\0\0\a\8\d\a\d\2\G\b\9\8\f\1\8\c\e\f\e\c\4\3\1\5\a\6\c\9\2\7\7\7\2\9\2 ]]

引用/转义看起来有点奇怪,但您可以看到它$line没有得到扩展,并且$key包含“HMAC-SHA1(whiskey.jpg)=”以及散列。


推荐阅读