#bash #macos
#bash #macos
Вопрос:
Пытаюсь написать скрипт, который будет проходить через мои предпочтительные беспроводные сети и удалять все, кроме моей домашней сети Wi-Fi. У меня есть несколько рабочих скриптов, но проблема в том, что когда он попадает в домашнюю сеть, он застревает. Поскольку он не удаляется из списка при повторном цикле, он продолжает нажимать на этот 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:
Вместо того, чтобы использовать управляющую переменную цикла «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’ в коде, чтобы избежать проблем для других читателей, которые могут скопировать и вставить этот код.
Комментарии:
1. Да, это сработало отлично. Спасибо за помощь и разборку.