Как изменить последний бит переменной

#bash

#bash

Вопрос:

Я хочу изменить последний бит IP-адреса.

 IP=10.10.10.10  
echo $ip |cut -d"." -f1-3
  

Отобразится « 10.10.10 »
Я хочу включить « .0 «

Комментарии:

1. Изменение последнего бита приведет к его изменению на .11 (ORing или XORing a 1 )

2. Извините за путаницу, я должен был упомянуть последнее значение, я думаю.

3. @RajGowda Стандартным термином для частей адреса IPv4 является » октет » (поскольку он состоит из 8 бит).

Ответ №1:

Попробуйте:

 $ ip=10.10.10.10
$ echo "${ip%.*}.0"
10.10.10.0
  
  1. ${ip%.*} удаляет последнюю точку и цифры после нее.

  2. .0 добавляет .0 в конец строки.

  3. Этот подход использует только оболочку, что делает его быстрее, чем методы, требующие конвейера.

  4. Лучше всего использовать нижний или смешанный регистр для ваших переменных. Система использует все переменные верхнего уровня, и вы не хотите случайно перезаписать одну из них.

Комментарии:

1. @RajGowda Пожалуйста, поставьте зеленую галочку рядом с ответом, чтобы будущие посетители знали, что этот ответ сработал для вашего варианта использования.

Ответ №2:

XOR на 1 (Bash 4 для расширения параметра):

 ipv4_address="${ipv4_address%.*}.$(( ${ipv4_address##*.} ^ 1 ))"
  

Ответ №3:

Это сделает это в bash:

 ip="10.10.10.10"
x=`echo $ip|cut -d "." -f1-3`
echo "$x.0"
  

Комментарии:

1. Это и глючно, и неэффективно по сравнению с ответом John1024. Re: «ошибка», см. BashPitfalls # 14 ; если бы у вас было IFS=. , например, echo $ip было бы изменение всех . s на пробелы. Re: «неэффективно», имейте в виду, что все подстановки команд и конвейеры требуют fork() отключения подпроцессов, а затем для запуска cut требуется exec совершенно другой исполняемый файл в пространстве памяти.