我有一个简单的BASH shell脚本,它检查curl命令的HTTP响应代码。 逻辑很好,但我坚持“简单地”打印出“输出”。
我正在使用GNU bash,版本3.2.25(1)-release(x86_64-redhat-linux-gnu)
我想用标签输出网址 - 然后是404 | 200 | 501 | 502响应。例如:
http://www.google.co.uk<tab>200
我也遇到一个奇怪的错误,其中URL的“http”部分被200 | 404 | 501 | 502覆盖。是否有基本的BASH shell脚本(功能),我没有使用?
感谢
数。
#!/bin/bash
NAMES=`cat $1`
for i in $NAMES
do
URL=$i
statuscode=`curl -s -I -L $i |grep 'HTTP' | awk '{print $2}'`
case $statuscode in
200)
echo -ne $URL\t$statuscode;;
301)
echo -ne "\t $statuscode";;
302)
echo -ne "\t $statuscode";;
404)
echo -ne "\t $statuscode";;
esac
done
答案 0 :(得分:2)
从this answer您可以使用代码
response=$(curl --write-out %{http_code} --silent --output /dev/null servername)
替换到你的循环中,这将是
#!/bin/bash
NAMES=`cat $1`
for i in $NAMES
do
URL=$i
statuscode=$(curl --write-out %{http_code} --silent --output /dev/null $i)
case $statuscode in
200)
echo -e "$URL\t$statuscode" ;;
301)
echo -e "$URL\t$statuscode" ;;
302)
echo -e "$URL\t$statuscode" ;;
404)
echo -e "$URL\t$statuscode" ;;
* )
;;
esac
done
我也清理了echo语句,因此每个URL都有一个新行。
答案 1 :(得分:1)
尝试
200)
echo -ne "$URL\t$statuscode" ;;
答案 2 :(得分:0)
我在这里采取了一些措施,但我认为令人困惑的是,curl
有时会在初始请求被重定向时返回多个标题信息(因此有多个状态代码)。
例如:
[me@hoe]$ curl -sIL www.google.com | awk '/HTTP/{print $2}'
302
200
当您在循环中打印时,第二个状态代码似乎已成为下一个网址的一部分。
如果这确实是你的问题,那么有几种方法可以解决这个问题,具体取决于你想要实现的目标。
如果您不想关注重定向,只需忽略-L
curl
选项
statuscode=$(curl -sI $i | awk '/HTTP/{print $2}')
要仅获取最后一个状态代码,只需将整个命令传送到tail -n1
以仅使用最后一个。
statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tail -n1)
要显示订单中的所有代码,请使用空格替换所有换行符
statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tr "\n" " ")
例如,使用第三种情况:
[me@home]$ cat script.sh
#!/bin/bash
for URL in www.stackoverflow.com stackoverflow.com stackoverflow.com/xxx
do
statuscode=$(curl -siL $i | awk '/^HTTP/{print $2}' | tr '\n' ' ')
echo -e "${URL}\t${statuscode}"
done
[me@home]$ ./script.sh
www.stackoverflow.com 301 200
stackoverflow.com 200
stackoverflow.com/xxx 404