【问题标题】:BASH shell script echo to output on same lineBASH shell 脚本回显到同一行输出
【发布时间】:2012-01-03 22:55:24
【问题描述】:

我有一个简单的 BASH shell 脚本,它检查 curl 命令的 HTTP 响应代码。 逻辑很好,但我坚持“简单地”打印出“输出”。

我正在使用 GNU bash,版本 3.2.25(1)-release (x86_64-redhat-linux-gnu)

我想输出带有标签的 URL - 然后是 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

【问题讨论】:

    标签: bash curl redhat


    【解决方案1】:

    试试

     200)
        echo -ne "$URL\t$statuscode" ;; 
    

    【讨论】:

      【解决方案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 都有一个新行。

      【讨论】:

        【解决方案3】:

        我在这里尝试一下,但我认为让您感到困惑的是curl 有时会在初始请求被重定向时返回多个标头信息(因此返回多个状态代码)。

        例如:

        [me@hoe]$ curl -sIL www.google.com | awk '/HTTP/{print $2}'
        302
        200
        

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

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

        1. 如果您不想遵循重定向,只需在 curl 中省略 -L 选项

          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" " ")
          

        例如,使用第三种情况:

        [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 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-08-16
          • 2019-08-11
          • 1970-01-01
          • 2021-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多