我正在尝试制作一个shell脚本,该脚本读取下载URL的列表,以查找它们是否仍处于活动状态。我不确定我当前的脚本有什么问题(我是新手),任何指示都会有很大的帮助!
用户@pc:〜/test#cat stites.list
http://www.google.com/images/srpr/logo3w.png
http://www.google.com/doesnt.exist
notasite
脚本:
#!/bin/bash
for i in `cat sites.list`
do
wget --spider $i -b
if grep --quiet "200 OK" wget-log; then
echo $i >> ok.txt
else
echo $i >> notok.txt
fi
rm wget-log
done
,脚本将所有内容输出到notok.txt-(第一个Google站点应该转到ok.txt)。但是如果我跑:
wget --spider http://www.google.com/images/srpr/logo3w.png -b
然后做:
grep "200 OK" wget-log
它毫无问题地抓住了字符串。我用语法犯了什么诺布错误?谢谢M8!
-b选项将WGET发送到背景,因此您正在WGET完成之前进行GREP。
尝试没有-b选项:
if wget --spider $i 2>&1 | grep --quiet "200 OK" ; then
您正在做的事情有一些问题。
- 您的
for i in
将在包含空格的线路上存在问题。最好使用while read
读取文件的各个行。 - 您没有引用变量。如果文件中的一行(或行中的单词)从连字符开始怎么办?然后,WGET将把其解释为一种选择。您在这里有潜在的安全风险,还有错误。
- 创建和删除文件并不需要。如果您要做的就是检查是否可以达到URL,则可以在没有临时文件和额外代码的情况下执行此操作。
- wget不一定是最佳工具。我建议改用
curl
。
所以这是处理此问题的更好方法...
#!/bin/bash
sitelist="sites.list"
curl="/usr/bin/curl"
# Some errors, for good measure...
if [[ ! -f "$sitelist" ]]; then
echo "ERROR: Sitelist is missing." >&2
exit 1
elif [[ ! -s "$sitelist" ]]; then
echo "ERROR: Sitelist is empty." >&2
exit 1
elif [[ ! -x "$curl" ]]; then
echo "ERROR: I can't work under these conditions." >&2
exit 1
fi
# Allow more advanced pattern matching (for case..esac below)
shopt -s globstar
while read url; do
# remove comments
url=${url%%#*}
# skip empty lines
if [[ -z "$url" ]]; then
continue
fi
# Handle just ftp, http and https.
# We could do full URL pattern matching, but meh.
case "$url" in
@(f|ht)tp?(s)://*)
# Get just the numeric HTTP response code
http_code=$($curl -sL -w '%{http_code}' "$url" -o /dev/null)
case "$http_code" in
200|226)
# You'll get a 226 in ${http_code} from a valid FTP URL.
# If all you really care about is that the response is in the 200's,
# you could match against "2??" instead.
echo "$url" >> ok.txt
;;
*)
# You might want different handling for redirects (301/302).
echo "$url" >> notok.txt
;;
esac
;;
*)
# If we're here, we didn't get a URL we could read.
echo "WARNING: invalid url: $url" >&2
;;
esac
done < "$sitelist"
这是未经测试的。仅出于教育目的。可能包含坚果。