在 if 语句中使用变量空白但不使用 echo

在 if 语句中使用变量空白但不使用 echo

我正在尝试将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`

当我在 if 语句中进行检查时,变量 HTTP_STATUS 似乎为空。这怎么可能?为什么使用 tee 和 echo 变量将命令的输出保存到文件中,但在 if 语句中使用变量时却不起作用?

此致

答案1

HTTP 协议要求标头行以 <CR><LF>(回车符和换行符,\r\nUNIX 表示法)结尾。要查看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

两者在同一条线上。

相关内容