【问题标题】:Bash Script to read file and curl on each line and output if string foundBash脚本读取文件并在每行卷曲并在找到字符串时输出
【发布时间】:2019-12-18 20:19:48
【问题描述】:

尝试构建一个 shell 脚本来确定站点是否使用 PulseVPN。 该脚本接受一个包含 URL 列表的输入文件,逐行迭代每个 URL,执行 cURL 操作并 grep 获取特定字符串。如果找到字符串,则显示回显消息“使用 PulseVPN 的网站”

这是我的代码 -

Keyword="dana-na" # keyword to find for PulseSecure SSL VPN
while read -r line; 
do
if curl -s -L "$line" | grep "$keyword" > /dev/null
then
    # if the keyword is in the conent
    echo " The website $line is using Pulse Secure VPN" 
else
    echo "Pulse Secure VPN Not Found on $line"
fi
done < urls.txt

问题 代码正在运行,但这里的问题是当我在输入文件中只包含一个 URL 时。它给出了正确的结果。但是如果我在输入文件中包含多个 URL,那么它会给出不正确的结果。谁能解释为什么会这样。代码有什么问题吗?

【问题讨论】:

  • 您的代码无法运行,因为 grep 在您定义关键字时使用了 $keyword 变量(大小写不同)。一般来说,你的循环应该可以正常工作,但它会打印 The website $line is using Pulse Secure VPN for all urls due to keyword is empty
  • 您看到的错误结果是什么?
  • 请注意grep -q "$keyword"grep "$keyword" &gt;/dev/null 更高效,因为前者(但不是后者)可以在找到第一个匹配项后立即停止,而不是读取到文件末尾并将内容写入/dev/null
  • 顺便说一句,运行bash -x yourscript 来跟踪运行的各个命令并将它们与您的预期进行比较通常很有帮助。例如,如果您看到您的行在末尾显示有$'\r' 字符,那么您就知道存在换行符类型问题;如果您看到使用 '' 而不是您的关键字,您就知道要查看(并且可以找出 Keyword/keyword 名称不匹配问题)等。
  • 我不确定 curl 是否会使用其标准输入中的任何数据,但您可能想尝试 curl &lt;&amp;- ... 以确保它没有读取用于 read 的数据。

标签: bash shell curl


【解决方案1】:

由于 read 的工作方式,它可能会跳过最后一行。试试

while read -r line || [[ -n $line ]];

查看this 帖子了解更多信息。

【讨论】:

  • 如果问题中没有足够的信息来提供肯定的答案而不是推测性的答案,请发表评论而不是回答(并且可能会因为缺乏足够的信息而投票结束)。此外,如果这真的是问题所在,我们希望将问题关闭为与您正在链接的问题重复的问题,而不是添加仅指向预先存在的知识库条目的答案。
  • 我要爱上无休止的失分螺旋,因为我不能评论和回答会失分。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-21
  • 2020-09-30
  • 2016-11-20
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
相关资源
最近更新 更多