通过首选无线网络进行循环删除

时间:2019-04-09 19:17:44

标签: bash macos

尝试编写一个脚本,该脚本将循环通过我的首选无线网络,并删除除我的家庭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中获取到正确的列表/数组中,以便可以将其循环并正确处理要删除的排除项吗?

1 个答案:

答案 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

我在代码中保留了“回声”,以避免其他可能复制和粘贴此代码的读者遇到问题。