if 문 오류 출력

if 문 오류 출력

여기에 스크립트가 있습니다.

#!/bin/bash

set -e
echo ""

declare -i value=00
unset optics_status

optics_status=$(curl -I xx.xx.xx.xx:4512 | grep 'X-Trace' | awk '{print $NF}' | rev |cut -c 1-3 | rev)


if [ $optics_status != $value ]; then
    echo "result is different means I am in if loop"
    echo "stats is $optics_status"
else
    echo "result is equal means I am in else loop"
    echo "stats is $optics_status"
fi

xx.xx.xx.xx은 서버 IP이고 curl명령만 실행하면 이것이 내가 얻는 출력입니다.

user@machine-lap:~/Documents$ curl -I xx.xx.xx.xx:4512 | grep 'X-Trace' | awk '{print $NF}' | rev |cut -c 1-3 | rev
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0  8359    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
00
user@machine-lap:~/Documents$

보시다시피 value로 설정했는데 00출력 optics_status도 입니다 00. 따라서 if 루프에 따르면 에코가 발생해야 i am in else loop하지만 에코만 발생 i am in if loop하고 그 이유를 이해할 수 없습니다.

간단히 말해서 if가 아닌 문을 에코합니다 else.

답변1

value변수를 로 만들고 싶다면 00에서 정수로 선언하지 마세요 bash. 정수로 선언하면 declare -i쉘이 정수로 평가하도록 프롬프트가 표시되며 정수 값은 000이 됩니다.

다음 코드가 출력됩니다 not same.

declare -i value='00'
optics_status='00'

if [ "$optics_status" = "$value" ]; then
   echo 'same'
else
   echo 'not same'
fi

declare -i value='00'로 변경하면 value='00'출력됩니다 same.

또한 위의 변수 확장에 대한 참조를 참고하세요.


물론 다음 방법 중 하나를 사용하여 해당 값을 비교하여 두 변수를 정수로 승격시키는 것을 고려할 수도 있습니다.

if [ "$optics_status" -ne "$value" ]; then

또는

if (( optics_status != value )); then

하지만 그것은 당신이 알고 있다고 가정합니다 $optics_value.언제나정수로 변환될 수 있는 문자열입니다(또한소수8진수 대신 정수).

답변2

cut범위는 포함되므로 세 문자를 제거했습니다. 공백, 탭, 개행 문자 등 이러한 문자 중 하나는 보이지 않을 수 있습니다. 이는 문자열을 값과 다르게 만듭니다 00.

일반적으로 set -o xtrace스크립트를 실행할 때 어떤 일이 발생하는지 확인해 보세요. 그리고더 많은 인용문 사용™!

관련 정보