我有一个需要使用curl 执行的url。如果状态为 200,则将响应写入临时文件中。现在将此临时文件与另一个文件进行比较("/opt/proc/config/init.txt")
。如果临时文件不同,则init.txt
用该临时文件替换内容。但如果状态不是 200,则退出并显示非零状态代码并显示一条消息。
以下是我所得到的。有没有更好或有效的方法来做到这一点?如果可能的话,这一切都可以在单行中完成吗?
URL="some_url"
# store the whole response with the status at the and
response=$(curl --silent --write-out "HTTPSTATUS:%{http_code}" -X POST $URL)
# extract the body
new=$(echo $response | sed -e 's/HTTPSTATUS\:.*//g')
# extract the status
status=$(echo $response | tr -d '\n' | sed -e 's/.*HTTPSTATUS://')
# print the body
echo "$new"
echo $new > /opt/proc/config/temp.txt
if [ $status -eq 200 ]; then
if ! cmp /opt/proc/config/init.txt /opt/proc/config/temp.txt > /dev/null 2>&1
then
echo different
mv /opt/proc/config/temp.txt /opt/proc/config/init.txt
else
echo same
fi
else
echo "Error [HTTP status: $status]"
rm /opt/proc/config/temp.txt
exit 1
fi
答案1
我不确定我会用来cmp
比较文件。也许我会简单地生成每个文件的 md5 或 sha1 指纹,并比较指纹。因为您不关心两个文件不同的偏移量和行号等详细信息,所以您只想知道两个文件是否完全相同。无论如何,除非文件非常大,否则我不会担心这里的性能问题。
为什么不简单地使用-o, --输出选项将下载的文件写入磁盘?
而不是使用或其他方式解析响应标头sed
,只需使用卷曲变量可用的即%{response_code}
。