я пытаюсь сравнить два IP-адреса с помощью команды bc

Переключайте функциональные клавиши, нажимая "F-Lock" (немецкое "F-Umsch")

Попав прямо в ту же проблему, я обнаружил причина - по крайней мере - моей проблемы: Использование клавиатуры ms natural 4000 иногда требует переключения функциональных клавиш, нажимая клавишу "F-Lock", расположенную рядом с F12.

(Переключение функциональных клавиш может помочь и с этим типом клавиатуры, если у вас нет бумажных копий и т. Д.)

0
10.10.2018, 12:42
3 ответа

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.

Нет, это не :191,35 == 191,350 > 191,254. bc сравнивает их численно, он не может сравнивать IP-адреса напрямую. Сначала вы должны преобразовать IP в целое число. Затем вы можете сравнить их, используя встроенные -модули оболочки, не прибегая к внешним инструментам.

Редактировать :проверить эту тему:Конвертер IP-адресов

0
28.01.2020, 04:12

Если у вас есть набор инструментов GNU, вы можете определить наименьшее из набора значений с помощью sort. Это также может обрабатывать частичные IP-адреса, такие как 191.35и 187.254в вашем примере.

printf "%s\0" 191.35 187.254 | sort -zV | head -zn 1 | tr -d '\0'

Поместите это в функцию оболочки, после чего вы сможете использовать проверку на равенство для определения меньшего из двух IP-адресов.:

# Return the lowest of a set of IP addresses
lowIP() {
    printf "%s\0" "$@" | sort -zV | head -zn 1 | tr '\0' '\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
0
28.01.2020, 04:12

Здесь не нужно использовать bc; ваша оболочка может обрабатывать октеты адреса 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
)

Если вы действительно хотите использовать bcпросто для сравнения цифр, сгенерируйте большой ifоператор вида:

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

а именно:

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
0
28.01.2020, 04:12

Теги

Похожие вопросы