Saya harus memberikan pujian kepada @ rubo77 di atas untuk jawaban murni-shell (kecuali Anda menghitung printf) di atas, yang saya cari.
Ini menambahkan sedikit sed ke:
(a) hilangkan setiap nol terkemuka di setiap potongan 16-bit; dan
(B) hilangkan lebih lanjut semua-nol potongan pada awal IID
... sesuai konvensi umum untuk singkatnya alamat.
mac_to_eui64() {
IFS=':'; set $1; unset IFS
echo "fe80::$(printf %x $((0x$1 ^ 2)))$2:${3}ff:fe$4:$5$6" |
sed -E 's/:0+/:/g; s/:{3,}/::/; s/:$/:0/'
}
Perhatikan bahwa jika Anda ingin menggunakan kembali ini untuk awalan lain (sewenang-wenang), yang mungkin Anda miliki sejak EUI-64 dapat digunakan dalam lingkup apa pun (meskipun disarankan untuk tidak menggunakannya untuk alamat global karena alasan privasi), Anda akan memerlukan sedikit skrip sed yang lebih berbelit-belit. Itu karena fe80::
awalannya sudah berisi tiga nol-potongan (elided ke double-colon) yang berdekatan dengan awal IID. Jadi, bahkan jika potongan pertama IID adalah semua-nol (yaitu, jika MAC mulai dengan 02:00
), itu akan hilang juga. Format EUI-64 hanya menyisakan satu potongan lebih lanjut yang bisa menjadi nol - yang terakhir - yang ditambahkan skrip di atas sebagai nol tunggal. Awalan lain mungkin mengharuskan satu untuk meninggalkan nol tunggal antara dua titik dua.