简短说明

简短说明

我是脚本语言的新手。我想了解别人编写的脚本。请向我解释一下这行脚本的作用:

IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'`

以下是我的 70-persistent-net.rules 中的内容:

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

# PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0 (e1000e)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:aa", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"

答案1

IF=`cat /etc/udev/rules.d/70-persistent-net.rules | grep $var | sed 's/^.*NAME=//' | tr -d '"'`

简短说明

这行脚本将保存文本eth0eth1将其存入变量IF。这完全取决于变量中的内容var

cat将显示文件的内容,grep将搜索并输出包含其中文本的行varsed将删除从行首到行后的所有内容NAME=tr删除所有引号"

该变量var很可能包含 MAC 地址,而该行的重点是提取该 MAC 地址的接口。您grep找到包含 MAC 地址的行,然后开始删除一些内容(使用sedtr),最后只剩下接口。

详细解释

具体如下:

  1. IF=`(somecommandhere)`:这意味着“将 的输出保存somecommandhere到名为 的变量中IF

  2. cat /etc/udev/rules.d/70-persistent-net.rules:显示文件内容/etc/udev/rules.d/70-persistent-net.rules。此时输出为:

    # PCI device 0x8086:/sys/devices/pci0000:00/0000:00:19.0 (e1000e)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    
    # PCI device 0x8086:/sys/devices/pci0000:00/0000:00:1c.5/0000:03:00.0 (e1000e)
    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:aa", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
    
  3. |这是一个管道符号,意思是“将管道前命令的输出作为管道后命令的输入”。因此,命令的输出cat将成为命令的输入grep。第二个管道意味着grep命令的输出将成为命令的输入sed,依此类推。

  4. grep $vargrep是一个搜索某些内容的工具。var是在此行之前脚本中某处定义的变量。

    假设变量包含00:0b:ab:6a:6b:a9。因此grep $var意味着“搜索并仅输出包含 的行00:0b:ab:6a:6b:a9。此时,输出现在是:

    SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0b:ab:6a:6b:a9", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
    
  5. sed 's/^.*NAME=//'sed是一个命令行工具,可以操作输入,删除或替换一些文本。

    下一部分意味着使用这种语法:'s/<replace this>/<with this>/'

    • 您的<replace this>^.*NAME=。这是一个正则表达式搜索模式。它用于“匹配”文本。此表达式表示:从行首开始匹配 ( ^),匹配所有内容 ( .*),直到NAME=。因此,基本上这就是匹配的内容(粗体文本):

      子系统=="net", 动作=="添加", 驱动程序=="?*", 属性{地址}=="00:0b:ab:6a:6b:a9", 属性{dev_id}=="0x0", 属性{类型}=="1", 内核=="eth*", 名称=“eth0”
    • Your<with this>什么都没有,所以你用什么都没有替换你匹配的文本。这基本上意味着你删除了你匹配的内容。

    在此阶段,输出如下:

    "eth0"
    
  6. tr -d '"':tr也是一个可以删除或翻译文本的命令行工具。这意味着删除所有双引号"。此最后阶段的输出为:

    eth0
    

答案2

首先,脚本中已经定义了一个变量 $var。我们不知道它是什么,但它可能是 MAC 地址。

/etc/udev/rules.d/70-persistent-net.rules脚本行通过“管道”机制将的内容输出到grep命令。其输出为:仅包含 $var 值的行。假定只有一行。然后由 处理这一行sed:它输出 之后的值NAME=。最后,tr命令删除双引号。

其结果为eth0eth1,具体取决于 $var 的值。然后,将此结果赋给变量 $IF。因此,此行脚本的意思是:将 $IF 设置为 MAC 地址为 $var 的接口的名称。

相关内容