bash - 如何遍历 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 脚本,所以我不确定在尝试运行每一行时我做错了什么/单词通过以找到匹配的输出。现在它似乎无限期地直到我退出它,没有可见的输出。
解决方案
这里有几个问题。按顺序,从第二行开始:
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)=”以及散列。
推荐阅读
- azure-service-fabric - 更改了服务结构集合名称,现在出现关于两阶段升级的错误
- r - R(dplyr)中的条件最大值?
- c - 同步读写
- powershell - Power shell 循环发送电子邮件并将输出写入文件
- sql-server - DataAdd 日期部分 varchar
- jquery - 多个下拉ajax的单个onchange
- html - 样式化 HTML/CSS 以实现给定的效果
- azure - Azure 中的 EUAP 区域是什么?
- r - grep() 在数据框中具有多个列名
- java - context.getBean 抛出 NoSuchBeanDefinitionException