여기에 스크립트가 있습니다.
#!/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
쉘이 정수로 평가하도록 프롬프트가 표시되며 정수 값은 00
0이 됩니다.
다음 코드가 출력됩니다 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
스크립트를 실행할 때 어떤 일이 발생하는지 확인해 보세요. 그리고더 많은 인용문 사용™!