【问题标题】:curl: (3) URL using bad/illegal format or missing URL - Checking response codecurl:(3) URL 使用错误/非法格式或缺少 URL - 检查响应代码
【发布时间】:2021-12-26 05:54:06
【问题描述】:

以下代码在 Ubuntu 20.04 上运行良好。它检查 .csv 文件,该文件包含 A 列中的 URL。每个地址 URL 都在一个新行中。

要使用它,您需要输入以下内容来运行脚本:

bash script.sh file_with_urls.csv response_code

例如:bash script.sh urls-to-check.csv 200

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

如果我在带有 WSL Ubuntu 20.04 发行版的 Windows 10 上使用它,我会收到“curl: (3) URL using bad/illegal format or missing URL”错误。

我有点卡住了……

【问题讨论】:

  • 您需要找出一种方法来找出哪个 URL(从文件中)失败。在调用curl 命令之前echo 它们或在成功调用后将它们打印到文件中......一旦你有了URL/罪魁祸首,你就可以看到它有什么问题(看看它是否遗漏了什么或者它在某种程度上是非法的)。没有任何额外的信息,除了猜测之外,我们没有其他简单的方法可以帮助您
  • read -r link 正在将整行(不仅仅是第一个字段)读入link。请参阅BashFAQ #1: "How can I read a file (data stream, variable) line-by-line (and/or field-by-field)?" CSV 文件可能还包含DOS/Windows line endings,这又增加了一堆潜在的混乱。添加set -x 作为脚本的第二行(就在shebang 之后)将打印一个执行跟踪,这将有助于显示此类问题。
  • 在调试模式下我什么都不懂,但是 URL 地址末尾的第二行有 \r。认为是这种情况...+ read link ++ curl --output /dev/null --silent --write-out '%{http_code}' {full_url_here}/\r' + response=000 [[ 000 == \4\0\4 ]] 当我像 dan 一样执行 sed 时,脚本工作正常。感谢您指出消息来源,以便我了解究竟发生了什么以及为什么
  • blueface,谢谢你的回答。我明白你说的,但我不知道如何做到这一点...这是因为我的技能太低了无法执行此操作...

标签: bash if-statement curl httpresponse do-while


【解决方案1】:

可能是行尾:

#!/usr/bin/env bash

while IFS=, read -ra link; do
    response=$(curl --output /dev/null --write-out %{http_code} "${link[0]}")
    if [[ "$response" == "$2" ]]; then
       echo "${link[0]}"
    fi
done < <(sed 's/\r$//' "$1")

您也可以通过dos2unix urls_to_check.csv 进行转换。如果你在 Windows 中打开它,它可能会被转换回来。

或者,像这样调用它:

bash script.sh <(sed 's/\r$//' file_with_urls.csv) response_code

【讨论】:

  • 您的回答是对 Gordon Davisson 所写内容的完美补充,两者都是极好的学习材料!当我最后使用 sed 时,该脚本有效。为什么你使用“${link[0]}”而不是“$link”?
  • @luknij 你说它是一个 csv 文件(逗号分隔变量)。如果有column-A,column-B,column-CIFS=, read-ra 将每一行拆分为一个 bash 数组,所以${link[0]} 是 A 列,${link[1]} 是 B 列,${link[2]} 是 C 列,等等。如果只有一个列,您可以使用read -r link。事实上,除了sed,您还可以使用curl ... ${link%$'\r'} 来删除回车。您还可以使用 dos2unix file.csv 永久删除 CR。但是,如果您在 Windows 中打开文件,它们可能会回来。
猜你喜欢
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
相关资源
最近更新 更多