执行curl调用后如果不同则替换文件

执行curl调用后如果不同则替换文件

我有一个需要使用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}

相关内容