if 문에서는 공백 변수를 사용하지만 에코는 사용하지 않습니다.

if 문에서는 공백 변수를 사용하지만 에코는 사용하지 않습니다.

컬 명령의 값을 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

컬이 HTTP/1.1 401 Unauthorized를 반환하도록 의도적으로 잘못된 비밀번호를 전달하고 있습니다. 잘못된 자격 증명이 서버로 전송되었는지 확인하는 기능이 필요합니다.

이상한 점은 컬 명령의 출력을 저장할 때 즉,

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 변수가 비어 있는 것 같습니다. 어떻게 이럴 수있어? if 문에서 변수를 사용할 때 tee 및 echo 변수를 사용하여 명령 출력을 파일에 저장하는 것이 작동하지 않는 이유는 무엇입니까?

감사합니다

답변1

HTTP 프로토콜에는 \r\n<CR><LF>(캐리지 리턴 및 줄 바꿈, 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

둘 다 같은 라인에 있습니다.

관련 정보