
Я пытаюсь сохранить значение из команды curl в переменную в скрипте bash.
Скрипт выглядит так
#!/bin/bash
curr=$(pwd)
IP_addr="192.168.0.102"
username="root"
password="pass"
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
echo
echo "echo the variable works!"
echo $HTTP_STATUS
isOK=$(echo $HTTP_STATUS)
status="HTTP/1.1 401 Unauthorized"
echo
if [[ $HTTP_STATUS == $status ]]; then
echo "The same the same!"
else
echo "$isOK is not the same as $status"
fi
echo
if [ "$status" == "$isOK" ]
then
echo "The same the same!"
else
echo "$isOK is not the same as $status"
fi
Я намеренно передаю неправильный пароль, чтобы curl вернул HTTP/1.1 401 Unauthorized. Мне нужна функция для проверки отправки на сервер неправильных учетных данных.
Странно то, что когда я сохраняю вывод команды curl, то есть
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)
В файл с tee я получаю это напечатано в файле HTTP/1.1 401 Unauthorized. Но если я удалю команду tee, то есть
HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)
И выполнить скрипт, который я получаю в терминале
./test.sh
echo the variable works!
HTTP/1.1 401 Unauthorized
is not the same as HTTP/1.1 401 Unauthorized
is not the same as HTTP/1.1 401 Unauthorized
Я попробовал сделать следующее, но результат тот же
HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`
Переменная HTTP_STATUS кажется пустой, когда я делаю проверки в операторах if. Как это возможно и почему вывод команды сохраняется в файл с tee и echo, переменная работает, но не при использовании переменной в операторах if?
С наилучшими пожеланиями
решение1
Протокол HTTP требует, чтобы строки заголовка заканчивались символами <CR><LF> (возврат каретки и перевод строки \r\n
в нотации UNIX). Чтобы увидеть, что curl
на самом деле возвращается, попробуйте:
curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v
В UNIX <LF> завершает текстовую строку, а <CR> — это просто обычный символ без особого значения. Очевидное отсутствие $isOK
в последующих сообщениях связано с завершающим <CR>, который перемещает курсор обратно в начало строки. В деталях, строка
echo "$isOK is not the same as $status"
выписывает
HTTP/1.1 401 Unauthorized<CR>
is not the same as HTTP/1.1 401 Unauthorized
оба на одной линии.