我正在尝试将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\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
两者在同一条线上。