我试着写一个脚本,它将循环通过我喜欢的无线网络,并删除除我家里的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还有没有其他人想要将数据从looped获取到一个适当的列表/数组中,这样它就可以循环,并正确地处理排除以进行删除?
发布于 2019-04-10 04:18:47
不使用循环控制变量"i",只需迭代所有结果即可。我们可以使用grep -v从列表中删除"home_wifi“。
我们可能应该使用while和read来允许使用带空格的网络名称,但这里是for循环版本,向您展示一种不同的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我在代码中保留了“echo”,以避免给其他可能复制和粘贴此代码的读者带来问题。
https://stackoverflow.com/questions/55599805
复制相似问题