Seu script realmente funciona. Tem certeza de que seu sites.txt
está correto? Por exemplo, tentei com:
$ cat sites.txt
google.com
unix.stackexchange.com
yahoo.com
Guardei o seu script como foo.sh
e executei-o no ficheiro acima:
$ foo.sh 2>/dev/null
HTTP/1.1 302 Found
http://google.com is up
HTTP/1.1 200 OK
http://unix.stackexchange.com is up
HTTP/1.1 301 Redirect
[10-03-2017:20:49:29] http://yahoo.com is DOWN. Status:HTTP/1.1 301 Redirect
A propósito, como você pode ver acima, ele falha no yahoo.com, que está redirecionando. Talvez a melhor maneira seria usar o ping para checar. Algo parecido com isto (incluindo algumas outras melhorias gerais):
while read site
do
if ping -c1 -q "$site" &>/dev/null; then
echo "$site is up"
else
echo "[$(date +%d-%m-%Y:%H:%M:%S)] $site is not reachable."
fi
done < sites.txt
Se você realmente precisa do status, use:
#!/bin/bash
## No need for cat, while can take a file as input
while read site
do
## Try not to use UPPER CASE variables to avoid conflicts
## with the default environmental variable names.
site="http://$site";
response=$(curl -I "$site" 2>/dev/null | head -n1)
## grep -q is silent
if grep -qE '200 OK|302 Moved|302 Found|301 Redirect' <<<"$response"; then
echo "$site is up"
else
## better to run 'date' on the fly, if you do it once
## at the beginning, the time shown might be very different.
echo "[$(date +%d-%m-%Y:%H:%M:%S)] $site is DOWN. Status:$response"
fi
done < sites.txt