compara dois endereços IP usando bc

0

Estou tentando comparar dois endereços IP usando o comando bc, no entanto, o IP com valor numérico menor não está sendo interceptado no teste.

Aqui está o meu código:

TEST=$(echo "$i < $IP_BRD && $i > $IP_LOW " | bc -q )

Se TEST resultar em 1, o processo continua e sai.

verifique o exemplo abaixo:

++ echo '191.35 < 187.254 && 191.35 > 184.1 '
+ TEST=0
++ echo '191.35 < 191.254 && 191.35 > 188.1 '
++ bc -q
+ TEST2=0
++ echo '191.35 < 195.254 && 191.35 > 192.1 '
++ bc -q
+ TEST3=0
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]
+ [[ 0 = 1 ]]

Na linha echo '191.35 < 191.254 && 191.35 > 188.1 ' , o IP 191.35 é menor que 191.254, mas não é visto como ele.

Eu tentei double quoutes no TEST=$(echo "$i < $IP_BRD && $i > $IP_LOW " | bc -q ) , mas não tive muito sucesso.

Alguma idéia de como corrigir isso?

    
por Atul 10.10.2018 / 05:26

3 respostas

0

In line echo '191.35 < 191.254 && 191.35 > 188.1 ' the IP 191.35 is less than 191.254 however its not being seen as it.

Não, não é: 191,35 == 191,350 > 191.254. bc compara-os numericamente, ele não pode comparar IPs diretamente. Você deve converter o IP em inteiro primeiro. Então você pode compará-los usando os recursos internos do shell sem recorrer a ferramentas externas.

Editar: confira este tópico: Conversor de endereços IP

    
por 10.10.2018 / 06:06
0

Se você tiver um conjunto de ferramentas GNU, poderá identificar o menor de um conjunto de valores com sort . Isso também pode manipular endereços IP parciais, como 191.35 e 187.254 em seu exemplo.

printf "%s
# Return the lowest of a set of IP addresses
lowIP() {
    printf "%s
printf "%s
# Return the lowest of a set of IP addresses
lowIP() {
    printf "%s%pre%" "$@" | sort -zV | head -zn 1 | tr '%pre%' '\n'
}

# Sample session
try=191.35
if [[ $(lowIP "$try" 187.254) == "$try" ]]
then
    echo "$try is the lower value"
else
    echo "$try is not the lower value"
fi
" 191.35 187.254 | sort -zV | head -zn 1 | tr -d '%pre%'
" "$@" | sort -zV | head -zn 1 | tr '%pre%' '\n' } # Sample session try=191.35 if [[ $(lowIP "$try" 187.254) == "$try" ]] then echo "$try is the lower value" else echo "$try is not the lower value" fi
" 191.35 187.254 | sort -zV | head -zn 1 | tr -d '%pre%'

Solte isso em uma função de shell e você poderá usar o teste de igualdade para identificar o menor de dois endereços IP:

%pre%     
por 10.10.2018 / 13:11
0

Você não precisa usar bc aqui; seu shell pode manipular os octetos de um endereço IPv4:

(
  IFS=.
  read i1 i2 i3 i4 <<< "$i"
  read b1 b2 b3 b4 <<< "$IP_BRD"
  read l1 l2 l3 l4 <<< "$IP_LOW"
  if [ "$i1" -le "$b1" -a "$i2" -le "$b2" -a "$i3" -le "$b3" -a "$i4" -lt "$b4" ] &&
    [ "$l1" -le "$i1" -a "$l2" -le "$i2" -a "$l3" -le "$i3" -a "$l4" -lt "$i4" ]
  then
    echo success
  else
    echo failure
  fi
)

Se você realmente quiser usar bc apenas para comparar dígitos, gere uma grande declaração if do formulário:

if (a < b)
  if (c < d)
    # ...
      1

ou seja:

if [ "$(printf "if (%d <= %d) if (%d <= %d) if (%d <= %d) if (%d < %d) \n \
                if (%d <= %d) if (%d <= %d) if (%d <= %d) if (%d < %d) 1\n" \
        "$i1" "$b1" "$i2" "$b2" "$i3" "$b3" "$i4" "$b4" \
        "$l1" "$i1" "$l2" "$i2" "$l3" "$i3" "$l4" "$i4" | bc)" = 1 ]
then
  echo success
else
  echo failure
fi
    
por 10.10.2018 / 17:34