Você pode usar IFS
para dividir o endereço MAC em 6 grupos separados por dois pontos e montá-los. Você também precisará virar o 7º bit mais significativo (obrigado bahamat ), ou seja, bit 1 do primeiro byte.
mac_to_ipv6 () {
IFS=':'; set $1; unset IFS
ipv6_address="fe80::$(printf %02x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6"
}
Você pode usar as construções de remoção de prefixo e sufixo ${VAR#PREFIX}
and ${VAR%SUFFIX}
para cortar o endereço MAC em partes.
mac_to_ipv6 () {
mac=$1
ipv6_address=fe80::$(printf %02x $((0x${mac%%:*} ^ 2)))
mac=${mac#*:}
ipv6_address=$ipv6_address${mac%:*:*:*}ff:fe
mac=${mac#*:*:}
ipv6_address=$ipv6_address${mac%:*}${mac##*:}
}
Você pode usar a construção de substring (somente bash, não sh).
mac_to_ipv6 () {
local mac=$1 byte0
printf %02x -v byte0 $((0x${mac:0:2} ^ 2))
ipv6_address="fe80::$byte0${mac:3:5}ff:fe${mac:9:5}${mac:15:2}"
}