Сценарий BASH-эхо выводится на той же строке - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть простой сценарий оболочки BASH, который проверяет код ответа HTTP команды curl. Логика в порядке, но я застрял на «просто» распечатки «вывода».

Я использую GNU bash, версия 3.2.25 (1) -релиз (x86_64-redhat-linux-gnu)

Я хотел бы вывести URL с вкладкой - тогда ответ 404 | 200 | 501 | 502. Например:

http://www.google.co.uk<tab>200

Я также получаю странную ошибку, когда http-часть URL перезаписывается на 200 | 404 | 501 | 502. Существуют ли базовые сценарии оболочки BASH (функция), которые я не использую?

спасибо

миль.

#!/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 ]

2 голосов
/ 22 ноября 2011

С этот ответ Вы можете использовать код

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 голос
/ 22 ноября 2011

попробуй

 200)
    echo -ne "$URL\t$statuscode" ;; 
0 голосов
/ 22 ноября 2011

Я принимаю удар здесь, но я думаю, что вас смущает тот факт, что curl иногда возвращает более одной информации заголовка (следовательно, более одного кода состояния), когда первоначальный запрос перенаправляется.

Например:

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

Когда вы печатаете это в цикле, может показаться, что второй код состояния стал частью следующего URL.

Если это действительно ваша проблема, то есть несколько способов решить ее в зависимости от того, чего вы пытаетесь достичь.

  1. Если вы не хотите следовать перенаправлениям, просто пропустите опцию -L в curl

    statuscode=$(curl -sI $i | awk '/HTTP/{print $2}')
    
  2. Toвзять только последний код состояния, просто перенаправить всю команду на 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 
...