将wifi设备名称分配给变量

时间:2018-10-24 17:42:33

标签: macos unix

我正在运行以下命令来确定当前正在使用哪个网络接口。

networksetup -listallhardwareports | grep -C1 $(route get default | grep interface | awk '{print $2}')

我如何使用该命令并解析出该接口的设备名称,然后将其与Wi-Fi接口的设备名称进行比较?


所以我运行上面的命令,这就是我得到的:

Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:b6:03:0a:97

这告诉我以太网端口或设备en0是计算机上的活动网络端口。我想将en0分配给一个变量,例如currentPort。

我还将运行以下命令:

networksetup -listallhardwareports

这将是以下结果:

Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:xx:xx:xx:xx

Hardware Port: Wi-Fi
Device: en1
Ethernet Address: 2c:f0:xx:xx:xx:xx

由此,我想获取我的wifi的设备名称,在这种情况下为en1,并将其分配给另一个变量,例如wifiPort。

所以我应该有currentPort = en0和wifiPort = en1。我希望我可以再运行一条if then命令,说currentPort与wifiPort不相同,请做一件事;如果currentPort与wifiPort相同,请执行其他操作。

希望这有助于更好地解释事情。


根据您的帮助,这就是我现在正在使用的内容。 echo $ currentport和echo $ wifiport不会给我任何输出,并且使用if命令,无论我使用什么设备,它都会回显“它们是相同的”。

#!/bin/bash

#currentport=`grep -A3 'Ethernet' t6.txt | grep "Device"| awk -F": " '{print $2}'`
currentport=`echo $a|grep -A3 'Ethernet'| grep "Device"| awk -F": " '{print $2}'`
echo $currentport

#wifiport=`grep -A3 'Wi-Fi' t5.txt | grep "Device"| awk -F": " '{print $2}'`
wifiport=`echo $b|grep -A3 'Wi-Fi'| grep "Device"| awk -F": " '{print $2}'`
echo $wifiport

if [[ $currentport == $wifiport ]]
then
    echo They are the same
else
    echo They are different
fi

exit 0

2 个答案:

答案 0 :(得分:0)

尝试一下:

对于currentport

假设您的networksetup命令的输出存储在文件t6.txt

Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:b6:03:0a:97

执行以下操作:

mayankp@mayank:~/ currentport=`echo $a|grep -A3 'Ethernet'| grep "Device"| awk -F": " '{print $2}'`
mayankp@mayank:~/ echo $currentport
en0

对于wifiport

假设您的networksetup命令的输出存储在文件t5.txt

Hardware Port: Ethernet
Device: en0
Ethernet Address: a8:60:xx:xx:xx:xx

Hardware Port: Wi-Fi
Device: en1
Ethernet Address: 2c:f0:xx:xx:xx:xx

执行以下操作:

mayankp@mayank:~/ wifiport=`echo $b|grep -A3 'Wi-Fi'| grep "Device"| awk -F": " '{print $2}'`
mayankp@mayank:~/ echo $wifiport
en1

现在,您拥有两个变量:$currentport$wifiport

使用if做你想做的事:

if [[ $currentport == $wifiport ]]
then
<do your stuff>
else
<do other stuff>
fi

让我知道这是否有帮助。

答案 1 :(得分:0)

我想我会避免使用所有这些管道,而只是在awk中这样做:

awk 'NR==FNR&&/interface/{i=$2} NR==FNR{next} index($0,"Device: "i)' \
 <(route get default) \
 RS= \
 <(networksetup -listallhardwareports)

awk脚本首先解析route命令的输出以确定要使用的接口,然后设置RS=强制awk进入多行模式,从而允许index()命令成为用作打印记录的条件。

如果只需要WiFi端口,则awk脚本甚至更简单,因为您无需解析route命令:

awk 'index($0,"Hardware Port: Wi-Fi")' RS= <(networksetup -listallhardwareports)

如果您想比较结果,即确定您当前是否正在使用WiFi,则可以很容易地将所需的命令包装在进程替换中。

#!/bin/bash

currentPort=$(
    awk '/interface/{print $2;exit}' <(route get default)
)
wifiPort=$(
    awk 'index($0,"Hardware Port: Wi-Fi") {
            sub(/.*Device: /,"");sub(/[[:space:]].*/,"")
            print; exit
        }' \
     RS= \
     <(networksetup -listallhardwareports)
)

if [[ "$wifiPort" = "$currentPort" ]]; then
    echo "I'm on WiFi!"
else
    echo "I'm NOT on WiFi!"
fi

当然,您也可以单独使用bash进行此操作,而无需使用awk:

#!/bin/bash

junk=$(route get default)
[[ $junk =~ .*interface:\ ([a-z]+[0-9]+) ]]
currentPort="${BASH_REMATCH[1]}"

while read line; do
        if [[ $line = *Wi-Fi ]]; then
                read line
                wifiPort="${line##* }"
                break
        fi
done < <(networksetup -listallhardwareports)

if [[ "$wifiPort" = "$currentPort" ]]; then
        echo "I'm on WiFi!"
else
        echo "I'm NOT on WiFi!"
fi

请注意,while read line循环并不是特别有效,bash 4 mapfile / readarray的性能会更好。但是macOS中bash的默认版本仍然是3.:)