我是脚本语言的新手。我想了解别人编写的脚本。请向我解释一下这行脚本的作用:
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 '"'`
简短说明
这行脚本将保存文本eth0
或eth1
将其存入变量IF
。这完全取决于变量中的内容var
。
cat
将显示文件的内容,grep
将搜索并输出包含其中文本的行var
,sed
将删除从行首到行后的所有内容NAME=
,tr
删除所有引号"
。
该变量var
很可能包含 MAC 地址,而该行的重点是提取该 MAC 地址的接口。您grep
找到包含 MAC 地址的行,然后开始删除一些内容(使用sed
和tr
),最后只剩下接口。
详细解释
具体如下:
IF=`(somecommandhere)`
:这意味着“将 的输出保存somecommandhere
到名为 的变量中IF
。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"
|
这是一个管道符号,意思是“将管道前命令的输出作为管道后命令的输入”。因此,命令的输出cat
将成为命令的输入grep
。第二个管道意味着grep
命令的输出将成为命令的输入sed
,依此类推。grep $var
:grep
是一个搜索某些内容的工具。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"
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"
tr -d '"'
:tr
也是一个可以删除或翻译文本的命令行工具。这意味着删除所有双引号"
。此最后阶段的输出为:eth0
答案2
首先,脚本中已经定义了一个变量 $var。我们不知道它是什么,但它可能是 MAC 地址。
/etc/udev/rules.d/70-persistent-net.rules
脚本行通过“管道”机制将的内容输出到grep
命令。其输出为:仅包含 $var 值的行。假定只有一行。然后由 处理这一行sed
:它输出 之后的值NAME=
。最后,tr
命令删除双引号。
其结果为eth0
或eth1
,具体取决于 $var 的值。然后,将此结果赋给变量 $IF。因此,此行脚本的意思是:将 $IF 设置为 MAC 地址为 $var 的接口的名称。