Зацикливание, хотя предпочтительная беспроводная сеть для удаления

#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. Да, это сработало отлично. Спасибо за помощь и разборку.