首页 > 解决方案 > 将 wifi 设备名称分配给变量

问题描述

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

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

标签: macosunix

解决方案


我想我会避免使用所有这些管道,只需在 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。:)


推荐阅读