Копируемая строка в bash не равна строке из переменной - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь сравнить строку из переменной (полученную из curl output) и строку с двойными кавычками в операторе IF, и они всегда неравны:

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ echo $curlResult
HTTP/2 200 
$ if [ "$curlResult" != "HTTP/2 200" ] ; then echo 1; else echo 0; fi 
1

What I попробовал:

  1. Установить переменную вручную по строке, и после этого они стали равными, поэтому проблема в curl выводе.

  2. Добавлен xargs для скручивания вывода для удаления пробелов, это не помогло:

    $ curlResult="$(curl -Isk https://stackoverflow.com/questions/ask | head -n 1 | xargs)"

Я новичок в bash, может, я потерял важные вещи.

Ответы [ 4 ]

2 голосов
/ 05 мая 2020

curlResult заканчивается пробелом, за которым следует \r. Вы можете удалить их из своей переменной или проигнорировать их в тесте. Я бы протестировал с

if [[ "$curlResult" =~ "HTTP/2 200" ]]; then
   echo "OK"
else
   echo "NOK"
fi
0 голосов
/ 05 мая 2020

Каждый заголовок завершается парой возврата каретки / перевода строки (CR / LF), но только LF удаляется подстановкой команды, оставляя CR как часть значения curlResult.

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ echo "${curlResult@Q}"
$'HTTP/2 200 \r'

Вы можете использовать сопоставление с образцом для сопоставления непробельного префикса строки.

$ [[ $curlResult = "HTTP/2 200" ]] && echo success
$ [[ $curlResult = "HTTP/2 200"*([[:space:]]) ]] && echo success
success

*([[:space]]) соответствует нулю или большему количеству пробельных символов, включая возврат каретки.

0 голосов
/ 05 мая 2020

Если вас интересует только HTTP-код, и для уменьшения сложности вы можете использовать соответствующую опцию команды curl.

HTTP_CODE=$(curl --silent --fail "https://example.com" --write-out "%{http_code}")
echo "${HTTP_CODE}"

if [[ "${HTTP_CODE}" -eq "200" ]]; then
  echo "OK / 1"
else
  echo "KO / 0"
fi

Поскольку он сообщает только код состояния, это может значительно упростить задачу.

0 голосов
/ 05 мая 2020

Это потому, что строка все еще содержит символы, которые не печатаются, например, echo:

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1)"
$ printf "%s\n" $curlResult
HTTP/2
200

Вы можете сделать следующее:

$ curlResult="$(curl -Isk https://stackoverflow.com | head -n 1 | tr -dc '[[:print:]]')"
$ if [[ "$curlResult" != "HTTP/2 200 " ]] ; then echo 1; else echo 0; fi
0

Обратите внимание, что Я оставил пробел после «HTTP / 2 200». Если вас это беспокоит, вы также можете удалить это с помощью tr.

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