if文では空白変数を使用しますが、エコーは使用しません。

if文では空白変数を使用しますが、エコーは使用しません。

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を返すように意図的に間違ったパスワードを渡しています。無効な資格情報がサーバーに送信されたことを確認する機能が必要です。

奇妙なことは、カールコマンドの出力を保存するとき、

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

どちらも同じ行にあります。

関連情報