如何检查shell是否存在URL并且可能卷曲?

sor*_*rin 62 shell curl

我正在寻找一个简单的shell(+ curl)检查,如果URL存在(返回200),它将被评估为true或false.

Cha*_*ffy 106

使用--fail将使失败的请求上的退出状态非零.使用--head将避免下载文件内容,因为我们不需要它来进行此检查.使用--silent将避免检查本身发出状态或错误.

if curl --output /dev/null --silent --head --fail "$url"; then
  echo "URL exists: $url"
else
  echo "URL does not exist: $url"
fi
Run Code Online (Sandbox Code Playgroud)

如果您的服务器拒绝HEAD请求,则另一种方法是仅请求文件的第一个字节:

if curl --output /dev/null --silent --fail -r 0-0 "$url"; then
Run Code Online (Sandbox Code Playgroud)

  • 包括`-o/dev/null`以禁止将标头打印到stdout (4认同)
  • 添加--location以跟踪重定向并报告重定向到URL的存在而不是原始URL (3认同)
  • @NamNguyen,...这是一个有趣的问题,无法妥善处理-一种方法是使用`-r 0-0`仅请求文件的第一个字节。我已经适当修改了答案。 (2认同)
  • @NamNguyen我也强烈建议"返回0"和"返回1"以获得真实性和虚假性,而不是使用stdout将"true"和"false"作为字符串返回.这样,有人可以运行:`if existURL"$ url"`,没有额外(低效)的开销,试图捕获它的stdout并解释相同的. (2认同)
  • @NamNguyen,...如果您想要分组运算符,请考虑“if {curl ...;” }; then` 而不是 `if (curl ...); then`,这避免了这种低效率。 (2认同)

ail*_*nlv 23

我发现wget比CURL更适合这个工具; 记住的选项较少,你可以在bash中检查它的真值,看它是否默认成功.

if wget --spider http://google.com 2>/dev/null; then
  echo "File exists"
else
  echo "File does not exist"
fi
Run Code Online (Sandbox Code Playgroud)

--spider选项使wget只检查文件而不是下载它,并使2> /dev/nullwget的stderr输出静音.

  • 这就是为什么我说"默认".尝试运行`wget google.com/asdf`和`curl google.com/asdf`.遇到404错误时,`curl`默认返回EXIT_SUCCESS,而`wget`返回EXIT_FAILURE. (3认同)
  • 这就是 `--spider` 参数的用途:它使 `wget` 在检查文件是否存在后返回,而不是下载它。 (2认同)