saída incorreta da instrução if

0

Aqui está o script.

#!/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 é um IP do servidor e se eu executar o comando curl separadamente, esta é a saída que recebo.

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$

Como pode ver, defini value para 00 e a saída de optics_status também é 00 . Então, de acordo com o loop if, ele deve ecoar i am in else loop , mas apenas ecoa o i am in if loop e não consigo entender o porquê.

Para colocá-lo em palavras mais simples, ele está ecoando a declaração if em vez de else .

    
por Nishant 07.05.2018 / 11:35

2 respostas

2

Se você quiser que sua variável value seja 00 , não a declare como um inteiro em bash . Declará-lo como um inteiro com declare -i solicitará que o shell o avalie como um inteiro, e o valor inteiro de 00 seja zero.

Observe que o seguinte código irá gerar not same :

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

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

A alteração de declare -i value='00' para value='00' resultará na produção de same .

Observe também as citações das expansões de variáveis acima.

Você poderia, é claro, também considerar a promoção dos valores de ambas as variáveis para números inteiros comparando-os usando

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

ou

if (( optics_status != value )); then

mas assume que você sabe que $optics_value é sempre uma string que pode ser convertida em um inteiro (e um inteiro decimal ao invés de um inteiro inteiro também).

    
por 07.05.2018 / 12:24
1
Os intervalos de

cut são inclusivos, então você extraiu três caracteres. Um desses caracteres pode ser invisível, como espaço, tabulação ou nova linha. Isso torna a string diferente do valor 00 .

Em geral, experimente set -o xtrace para ver o que acontece ao executar seu script. E Use More Quotes ™ !

    
por 07.05.2018 / 11:45