Почему этот тест на равенство строк не выполняется? - PullRequest
0 голосов
/ 16 мая 2019

Добрый день

Я пишу простой скрипт для проверки работоспособности сайта после того, как Gitlab развернул файл war.

На данный момент скрипт Bash:

#!/bin/bash

for i in {1..10}
    do
        response=$(curl -Is http://mysite/ | head -n 1)
        echo "$response"
        if [ "$response" == "HTTP/1.1 200 OK" ]; then
            echo "SITE UP"
            $i = 11
        fi
        sleep 5s
    done
if [ $i == 11 ]; then
    exit 1
fi
exit 0

Строки echo "$response" и echo "SITE UP" предназначены только для устранения неполадок и будут удалены из окончательного сценария.

Мой вывод в терминале на данный момент:

HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK
HTTP/1.1 200 OK

Очевидно, что сравнение строк не удается. Почему это?

Ответы [ 2 ]

10 голосов
/ 16 мая 2019

Заголовки HTTP используют окончания строки CRLF (\r\n):

$ curl -Is http://example.com | head -n1 | od -c
0000000   H   T   T   P   /   1   .   1       2   0   0       O   K  \r
0000020  \n
0000021

Но подстановка команд только удаляет завершающий символ новой строки (\n), а не возврат каретки (\r), поэтому есть дополнительный символ:

$ response=$(curl -Is http://example.com/ | head -n 1)
$ printf "$response" | od -c
0000000   H   T   T   P   /   1   .   1       2   0   0       O   K  \r
0000020
$ printf "HTTP/1.1 200 OK" | od -c
0000000   H   T   T   P   /   1   .   1       2   0   0       O   K
0000017

Вы можете попробовать удалить возврат каретки:

response=$(curl -Is http://mysite/ | head -n 1 | tr -d '\r')

Тогда:

$ response=$(curl -Is http://example.com/ | head -n 1 | tr -d '\r')
$ printf "$response" | od -c
0000000   H   T   T   P   /   1   .   1       2   0   0       O   K
0000017
1 голос
/ 16 мая 2019

Команда if фактически принимает команду в качестве аргумента и оценивает ее возвращаемое значение. Команда в if [ ... ] является [, что является псевдонимом для test.

И если вы прочитаете страницу справки test , вы увидите, что для сравнения строк вы используете одну =. Так что вместо этого вы должны иметь

if [ "$response" = "HTTP/1.1 200 OK" ]; then

Обратите внимание, что начальные и конечные пробелы в $response могут привести к неравным строкам. Примеры пробелов включают перевод строки "\n" или возврат каретки "\r".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...