【问题标题】:BASH Increment MAC AddressBASH 增加 MAC 地址
【发布时间】:2019-11-03 06:48:37
【问题描述】:

我在名为 oldMAC 的 var 中有一个有效的 mac 地址 我需要增加它,然后返回一个新的有效 MAC 地址。

在这个例子中,我递增 1,但它可以是任何值。

到目前为止,我得到了以下内容:

echo $oldMAC
mac=$(echo $oldMAC |  tr '[:lower:]' '[:upper:]' | tr -d ':') # upper case and remove :
echo $mac

macdec=$( printf '%d\n' 0x$mac ) # convert to decimal
echo $macdec

macadd=$( expr $macdec + 1 ) # add 1
echo $macadd

machex=$( printf '%X\n' $macadd ) # convert to hex
echo $machex

这个输出:

00:12:34:ae:BC:EF (oldMAC)
001234AEBCEF (mac)
78193278191 (macdec)
78193278192 (madadd)
1234AEBCF0 (machex)

我遇到的问题是如何转换1234AEBCF0,使其返回为00:12:34:AE:BC:F0

任何人都可以建议如何做到这一点......或者有更好的方法吗?

谢谢

【问题讨论】:

  • 我建议不要在为制造商保留的范围内创建自己的地址。
  • 嗨。以上是一个示例,我将使用一个我被建议开放使用的范围。
  • 去掉冒号mac=${oldMAC//:},字符串大写:mac=${mac^^}

标签: bash macos hex decimal


【解决方案1】:

sed救援:

macnew=$(echo $machex | sed 's/../&:/g;s/:$//')

模式是

+------------ substitute
|  +--------- any two characters
|  | +------- with the whole match
|  | |+------ and :
|  | || +---- all occurrences, utilizing the fact it means non-overlapping
|  | || |+------- another command
|  | || ||+------ substitute
|  | || ||  +---- :
|  | || ||  |+--- at the end of line
|  | || ||  || +- with nothing to get rid of the trailing :
V  V VV VV  VV V
s/../&:/g;s/:$//

您还需要确保实际打印了 12 位数字。 printf 命令可以做到这一点,只需使模式"%012x"0 表示用0s(而不是空格)填充,12 是最小宽度。对大写十六进制数字使用大写 X,对小写十六进制数字使用小写 x


你可以通过使用bash内置的算术扩展来稍微简化加法,它直接理解十六进制输出,并且理解大小写,所以你只需要删除:s:

mac=$(echo $oldMAC | tr -d ':')
macadd=$(( 0x$mac + 1 ))

它仍然以十进制返回,因此您仍然需要 printf "%012x" 来转换它。您可以将其直接通过管道传输到 sed 以保持简短。

macnew=$(printf "%012x" $macadd | sed 's/../&:/g;s/:$//')

【讨论】:

  • 谢谢 - 这种工作,但返回 12:34:ae:bc:f0 而不是 00:12:34:ae:bc:f0 我该如何排序?
  • @Tom,哦,对了,我错过了。您需要告诉 printf 将其零填充到 12 位,这是通过使用 %012x 作为说明符来完成的(0 表示零填充并且请求宽度为 12)
【解决方案2】:

只需要改两行。

mac=$(echo $oldMAC | tr '[:lower:]' '[:upper:]' | tr -d ':')

 mac=$(echo $oldMAC | sed s/":"//g)

然后

machex=$( printf '%X\n' $macadd )

machex=$( printf '%X\n' $macadd |tee|tr A-Z a-z)

总体

mac=$(echo $oldMAC|sed s/":"//g)
macdec=$(printf '%d\n' 0x$oldmac)
macadd=$(expr $macdec + 1)
machex=$( printf '%X\n' $macadd |tee|tr A-Z a-z)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-08-11
    • 1970-01-01
    • 2018-12-08
    • 2020-09-19
    • 1970-01-01
    相关资源
    最近更新 更多