【问题标题】:Chcecking the responde code of given URLs - Script don`t stop after checking all URL`s检查给定 URL 的响应代码 - 检查所有 URL 后脚本不会停止
【发布时间】:2021-10-21 17:39:02
【问题描述】:

我在下面做了一个脚本。该脚本正在检查列 A 中例如 .csv 文件中列出的每个 URL 的响应代码。一切都按我的计划工作,但是在检查所有 URL 之后,脚本被冻结。我必须做 ctrl+c 组合来阻止它。检查所有 URL 后,如何使脚本自动结束运行。

#!/bin/bash
for link in `cat $1` $2;
do
response=`curl --output /dev/null --silent --write-out %{http_code} $link`;
if [ "$response" == "$2" ]; then
echo "$link";
fi
done

【问题讨论】:

  • 你是如何运行脚本的(确切的命令行)? example.csv的内容是什么?没有更多细节,这是不可重现的。
  • 不,它没有检查 A 列中的所有内容。它遍历文件中的每个单词,用空格分隔。这里没有处理 csv 或列。
  • 我运行脚本“bash {my_script.sh} {example.csv} {response_code}”。在 {response_code} 中,我输入了检查 200、301、404 等所需的响应代码。example.csv 在 A 列中包含 URL 地址。每一行包含一个 URL 地址。我以包含我指示的响应代码的地址列表的形式获得结果。只有脚本在检查列表中的所有地址时不会停止。

标签: bash for-loop if-statement terminal script


【解决方案1】:

您的脚本由于for link 行中的$2 而挂起(当它挂起时,请检查ps aux | grep curl,您会发现一个以响应代码作为最后一个参数的 curl 进程)。此外,for link in `cat $1` $2 不是您应该从文件中读取和处理行的方式。

假设您的 example.csv 文件每行只包含一个 URL 而没有其他内容(这基本上使它成为一个纯文本文件),那么这段代码应该可以满足您的需求:

#!/usr/bin/env bash
while read -r link; do
    response=$(curl --output /dev/null --silent --write-out %{http_code} "$link")
    if [[ "$response" == "$2" ]]; then
        echo "$link"
    fi
done < "$1"

【讨论】:

  • 是的,就是这样。谢谢你解释我的想法是多么错误。这也是学习和加深知识的宝贵代码是这个领域......
【解决方案2】:

逐字复制您的代码并使用几个由空格分隔的 url 来伪造一个测试文件以进行测试,它确实挂起。但是,从 for 末尾删除 $2 允许脚本完成。

for link in `cat $1`;

【讨论】:

  • 是的,但事实并非如此。如果我从 FOR 循环中删除 $2,我将无法定义我想在 URL 中检查的响应代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 2012-11-07
相关资源
最近更新 更多