Соответствие строк в выражении bash case и поиск текущей беспроводной сети

У меня есть скрипт bash (для личного использования), часть которого печатает сообщение в зависимости от того, к какой сети я подключен. В рамках этого я хочу посмотреть на идентификатор подключенной в данный момент беспроводной сети.

То, что я делаю, анализирует имя беспроводной сети из вывода iwconfig и я хочу распечатать имя или специальное сообщение для определенных сетей:

SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\"/\1/"` 2>/dev/null
case "$SSID" in
    StaffOnly)
        echo "Staff only network at Work" ;;
    *)
        echo "You're on a wireless network called $SSID"
esac

Вторая часть этого (печать названия любой сети, к которой я подключен) работает, но особый случай нахождения в сети StaffOnly не совпадает и проваливается через другую.

Я хотел бы знать, что я делаю не так с case заявление. А также, если есть просто лучший способ сделать это в любом случае.

2 ответа

Решение

sed команде не хватает запаздывания .*, Так должно быть:

SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/"` 2>/dev/null
                                                              ^^ HERE!

Без этого вы покидаете конец строки, и он, очевидно, содержит пробелы, которые вызывают для вас несоответствие.

Несколько связанных заметок:

  • Перенаправление должно идти внутри обратной цитаты:

    SSID=`iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/" 2>/dev/null`
    
  • $() как правило, предпочтительнее, чем обратная цитата, потому что она может вкладывать:

    SSID=$(iwconfig wlan0|grep "ESSID:" | sed "s/.*ESSID:\"\(.*\)\".*/\1/" 2>/dev/null)
    
  • При выполнении отладочной печати всегда добавляйте разделители вокруг содержимого переменной, чтобы вы могли видеть начальные и конечные пробелы.

Вам не нужно sed, Все это можно сделать с помощью grep следующее:

SSID=$(iwconfig wlan0 | grep -oP '(?<=ESSID:")[^"]*')
Другие вопросы по тегам