尝试编写一个脚本,该脚本将循环通过我的首选无线网络,并删除除我的家庭wifi网络以外的所有无线网络。我有一些工作脚本,但问题是当它到达家庭网络时会卡住。由于它不会在再次循环时从列表中删除,因此会一直命中该SSID,直到脚本结束。
我知道问题在于如何获取网络名称,但是我想不出另一种获取网络名称并正确设置其格式的方式,因此可以将其添加到列表/数组中。
#!/bin/bash
WIFIDEIVCE=$(networksetup -listallhardwareports | grep "Wi-Fi" -1 | tail -1 | awk '{print $2}'
NETWORKLISTCOUNT=$(networksetup -listpreferredwirelessnetworks ${WIFIDEIVCE} | wc -l)
for (( i = 0; i < $NETWORKLISTCOUNT -1; i++ )); do
NETWORKNAME=$(networksetup -listpreferredwirelessnetworks ${WIFIDEIVCE} | tail -1 | awk '{$1=$1};1' )
if [ "$NETWORKNAME" != "home_wifi" ]; then
networksetup -removepreferredwirelessnetwork ${WIFIDEIVCE} "$NETWORKNAME"
else
echo "Network is $NETWORKNAME and will not be removed"
fi
done
还有其他人想要将数据从listpreferredwirelessnetworks中获取到正确的列表/数组中,以便可以将其循环并正确处理要删除的排除项吗?
答案 0 :(得分:1)
而不是使用循环控制变量“ i”,只需遍历所有结果即可。我们可以使用grep -v从列表中消除“ home_wifi”。
我们应该使用一会儿阅读,以允许带有空格的网络名称,但这是for循环的版本,向您展示了用于循环的另一种方式。
#!/bin/bash
WIFIDEIVCE=$(networksetup -listallhardwareports | grep "Wi-Fi" -1 | tail -1 | awk '{print $2}')
for NETWORKNAME in $( networksetup -listpreferredwirelessnetworks ${WIFIDEIVCE} | tail -n+2 | grep -v home_wifi )
do
echo networksetup -removepreferredwirelessnetwork ${WIFIDEIVCE} "$NETWORKNAME"
done
以下是在while循环中组织的相同代码,以避免网络名称中存在空格时出现问题:
#!/bin/bash
WIFIDEIVCE=$(networksetup -listallhardwareports | grep "Wi-Fi" -1 | tail -1 | awk '{print $2}')
networksetup -listpreferredwirelessnetworks ${WIFIDEIVCE} | tail -n+2 | grep -v home_wifi |
while
read NETWORKNAME
do
echo networksetup -removepreferredwirelessnetwork ${WIFIDEIVCE} "$NETWORKNAME"
done
我在代码中保留了“回声”,以避免其他可能复制和粘贴此代码的读者遇到问题。