Variable en blanco cuando se usa en la declaración if pero no en eco

Variable en blanco cuando se usa en la declaración if pero no en eco

Estoy intentando guardar el valor de un comando curl en una variable en un script bash.

El guión se ve así

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

Estoy pasando deliberadamente la contraseña incorrecta para que curl devuelva HTTP/1.1 401 no autorizado. Quiero una función para verificar si se envían credenciales incorrectas a un servidor.

Lo extraño es que cuando guardo el resultado del comando curl, es decir

HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP | tee $curr/test.txt)

En un archivo con tee, obtengo esto impreso en el archivo HTTP/1.1 401 No autorizado. Pero si elimino el comando tee, es decir

HTTP_STATUS=$(curl -IL --silent $username:$password@$IP_addr | grep HTTP)

Y ejecute el script que obtengo después de imprimir en la terminal

./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

Intenté con lo siguiente también pero obtuve el mismo resultado.

HTTP_STATUS=`curl -IL --silent $username:$password@$IP_addr | grep HTTP`

La variable HTTP_STATUS parece estar en blanco cuando hago las comprobaciones en las declaraciones if. ¿Cómo es esto posible y por qué la salida del comando se guarda en un archivo con tee y echo? La variable funciona pero no cuando se usa la variable en las declaraciones if.

Atentamente

Respuesta1

El protocolo HTTP requiere que las líneas de encabezado terminen con <CR><LF> (retorno de carro y avance de línea, \r\nen notación UNIX). Para ver lo que curlrealmente regresa, puedes probar:

curl -IL --silent $username:$password@$IP_addr | grep HTTP | cat -v

En UNIX, <LF> termina la línea de texto y <CR> es simplemente un carácter común y corriente sin significado especial. La aparente falta $isOKen los mensajes posteriores se debe al <CR> final, que mueve el cursor hacia atrás al principio de la línea. En detalle, la línea

echo "$isOK is not the same as $status"

escribe

HTTP/1.1 401 Unauthorized<CR>
 is not the same as HTTP/1.1 401 Unauthorized

ambos en la misma línea.

información relacionada