- extrair o primeiro byte (por exemplo,
07
do seu exemplo) - bit a bit E com decimal 254 (11111110 - todos os bits, exceto zeroth bit set)
- bit a bit OR com decimal 2 (00000010 - somente conjunto de 1º bit)
- combine o primeiro byte com os últimos cinco bytes
por exemplo,
#! /bin/sh
mac='07:d4:51:9f:50:6c'
lastfive=$( echo "$mac" | cut -d: -f 2-6 )
firstbyte=$( echo "$mac" | cut -d: -f 1 )
# make sure bit 0 (broadcast) of $firstbyte is not set,
# and bit 1 (local) is set.
# i.e. via bitwise AND with 254 and bitwise OR with 2.
firstbyte=$( printf '%02x' $(( 0x$firstbyte & 254 | 2)) )
mac="$firstbyte:$lastfive"
echo "$mac"
Saída:
06:d4:51:9f:50:6c
07
hex é 00000111
binário. bit a bit AND-it com 254
( 11111110
binary) resulta em 00000110
binary (6 decimal). bitwise OR-ing com 2
( 00000010
binary) resulta em nenhuma mudança porque o bit 1 já está setado. O resultado final é 06
hex.