BASH shell脚本回显到同一行输出

时间:2011-11-22 14:54:32

标签: bash curl redhat

我有一个简单的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

3 个答案:

答案 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

当您在循环中打印时,第二个状态代码似乎已成为下一个网址的一部分。

如果这确实是你的问题,那么有几种方法可以解决这个问题,具体取决于你想要实现的目标。

  1. 如果您不想关注重定向,只需忽略-L

    中的curl选项
    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}')
    
  2. 要仅获取最后一个状态代码,只需将整个命令传送到tail -n1以仅使用最后一个。

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tail -n1)
    
  3. 要显示订单中的所有代码,请使用空格替换所有换行符

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}' | tr "\n" " ")
    
  4. 例如,使用第三种情况:

    [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