我使用下面的命令来卷曲url,并显示--write out
选项提供的响应\u code
和时间\u total
curl -o /dev/null -sL $@ -w "$(printf %-100.100s $@) %{response_code}\t%{time_total}\n"
# https://example.com/?p=5 200 0.084437
由于一些页面显示了基于cms的404,我想检查页面内容中的特定字符串,并在输出中显示包含:true/false
:
https://example.com/?p=4 No 200 0.084437
https://example.com/?p=5 Yes 200 0.081241
所以我想真正的问题是,如何让-w
显示他的输出,同时将响应主体保存到变量?
基于这个答案,我目前正在使用这个变通方法:
# <body>\n<code>#<time>
c=$(curl -o - -s -L ${1} -w "%{response_code}#%{time_total}")
# Body
cb=$(sed '$ d' <<< "$c")
# Info
ci=$(tail -n1 <<< "$c")
IFS='#' read -r -a cs <<< "$ci"
# CMS-404
ul=<regex magic>
[[ $ul != ${2} ]] && pe="CMS-404" || pe=""
# Print result
printf "$(printf %-100.100s ${1})\t${pe}\t\t${cs[0]}\t${cs[1]}\n"
它捕获完整的输出,获取最后一行,其中包含-w
信息,并使用sed
获取剩余内容,即正文。
由于我希望-w
输出(可选)是多行,因此我正在寻找一种更可靠的方法来实现这一点。
链接问题/答案
>
如何使用cURL一次测量请求和响应时间?
因为-w
不能输出页面内容,不是一个选项
如何在Bash中将curl输出存储在多个变量中
是拆分页面内容,无-w
选项
Curl返回超文本传输协议状态代码以及响应
不保存为变量
补充资料
编辑,根据@Philippe的回答,这似乎是可行的,但是,ci=“${c#*$'\1'}”
非常慢,因为我使用这个函数处理1000个url,我希望有一个“更快”的解决方案。
我已经用下面的脚本进行了测试,简化了;
#!/bin/bash
get() {
echo "---> ${1}"
# Request
c=$(curl -o - -s -L ${1} -w $'\1'"%{response_code}#%{time_total}")
# Body
cb="${c%$'\1'*}"
time_after_body=$(date +%s%N)
ci="${c#*$'\1'}"
time_after_info=$(date +%s%N)
time_diff="$((time_after_info - time_after_body))"
echo "TimeDiff: ${time_diff}ms"
echo "CurlInfo: ${ci}"
}
get "https://stackoverflow.com/questions/65395089/save-curl-response-and-w-to-variables"
✗ ./small_so.sh
---> https://stackoverflow.com/questions/65395089/save-curl-response-and-w-to-variables
TimeDiff: 9886412000ms
CurlInfo: 200#0.469687
您能使用像$'\1'
这样的标记吗?
#!/usr/bin/env bash
c=$(curl -o - -s -L ${1} -w $'\1'"%{response_code}#%{time_total}")
cb="${c%$'\1'*}"
ci="${c#*$'\1'}"
declare -p cb ci
# Calling method : ./test.sh "https://example.com/?p=5"
我刚刚在macos上测试过:
~/$ /bin/bash --version
GNU bash, version 3.2.57(1)-release (x86_64-apple-darwin20)
Copyright (C) 2007 Free Software Foundation, Inc.
~/$ /bin/bash test.sh "https://example.com/?p=5"
declare -- cb="<!doctype html>
...
"
declare -- ci="200#0.693779"
问题内容: 我仍然是jQuery和ajax领域的新手,但是我有一个$ .ajax请求,执行GET来检索一些XML文件(〜6KB或更少),但是在用户花那个页面的时间内,XML内容应该不会/不会更改(此设计我无法更改,在我从其他地方读取XML文件时也无权更改它)。因此,我有一个全局变量将响应数据存储到该变量中,并且对该数据进行的所有后续查询都将在此变量上进行,因此不需要进行多个请求。 考虑到XML文件
问题内容: 我使用getJSON从我的网站请求JSON。效果很好,但是我需要将输出保存到另一个变量中,如下所示: 我需要将结果保存到其中,但似乎此语法不正确。有任何想法吗? 问题答案: 仅在响应后才能调用,无法获得价值。
问题内容: 我想知道如何将PHP变量保存到txt文件,然后再次检索它们。 例: 有一个输入框,提交后,在输入框中写入的内容将保存到文本文件中。稍后,需要将结果作为变量返回。因此,可以说变量是$ text,我需要将其保存到文本文件中并能够再次取回它。 问题答案: 这应该可以执行您想要的操作,但是如果没有更多上下文,我无法确定。 将$ text写入文件: 再次检索它:
问题内容: 我试图在同一行中打印逗号后的值,以便我可以拥有这些值的csv文件,但即时通讯无法保存的值 预期输出为 请让我知道我做错了,谢谢! 问题答案: 使用反引号(或-可以嵌套),而不是单引号:
我有一个包含10个项目(书名)的Jlist。用户将被允许从10个项目中选择3个。我想将选定的项目保存到3个不同的字符串变量(例如book0、book1、book2等)。 我不知道该怎么做。
问题内容: 我遇到下面显示的行未将变量存储到全局范围的问题: 我究竟做错了什么?我需要将其包装到单独的函数中还是什么? 问题答案: 该代码在收到响应之前运行。 这就是为什么。 在这里,您可以看到警报发生故障。默认情况下,AJAX请求不会阻止后续代码运行。 这就是拥有 回调 方法的全部目的。该方法在适当的时间被调用,而不是依赖于同步执行。