检查网页是否已更改的脚本

时间:2018-12-10 19:58:31

标签: linux bash shell

我有一个要求,我必须从文本文件(sites.txt)中读取网站列表,并检查自上次运行脚本以来是否有任何静态更改。我的输入是

https://en.wikipedia.org/wiki/Stack_Overflow
https://en.wikipedia.org/wiki/Linux
https://en.wikipedia.org/wiki/Linus_Torvalds

如果有任何一个网站宕机,则应像下面的输出示例一样,将地址名称和消息FAILED打印到stderr。

https://en.wikipedia.org/wiki/Stack_Overflow FAILED

如果输入文本文件包含#,它也应忽略该行作为注释。我的尝试是创建2个html文件old.html和new.html,并在if语句中检查html文件的减法是否不同于0。我的问题是我的输出与我预期的不同,并且curl命令始终假设网站已关闭。我的输出是:

 FAILED/en.wikipedia.org/wiki/Stack_Overflow
 FAILED/en.wikipedia.org/wiki/Linux
https://en.wikipedia.org/wiki/Linus_Torvalds FAILED

这是我的代码:

#!/bin/bash

while read line || [ -n "$line" ]; do
    [[ "$line" = "\#*" ]] && continue
    if [ "$(curl -s --head  --request GET "$line" | grep "200 OK" > /dev/null)" ]; then
        mv new.html old.html 2> /dev/null
        curl "$line" -L --compressed -s > new.html 
        DIFF_OUTPUT="$(diff new.html old.html)"
        if [ "0" != "${#DIFF_OUTPUT}" ]; then
            echo "$line Changed"
        fi  
    else
        echo "$line FAILED" >&2
    fi
done <"$1"

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

sites.txt具有DOS行结束符\r\n,而不是UNIX行结束符\n\r回车引起光标移回第一列。您需要convert sites.txt to UNIX formatdelete the carriage returns from $line