Соответствие строк в выражении 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:")[^"]*')