Сценарий пепла: переменная, содержащая пробел, отказывается быть очищенной
Я пытаюсь запустить сценарий, указанный по адресу http://talk.maemo.org/showthread.php?t=70866&page=2 на своем предполагаемом оборудовании - телефоне Nokia Linux с установленной программой BusyBox ash. Сценарий получает имя сети WiFi в качестве параметра и пытается подключить к нему телефон. Я подозреваю, что скрипт работает, но мой SSID, BU (802.1x), содержит пробел и круглые скобки. Поэтому, когда я печатаю в командной строке
autoconnect.sh BU\ \(802.1x\)
Я получаю различные ошибки. Первый,
LIST=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}'`
if [ $LIST = "\"$1\"" ]; then
... не удается, даже я подключен к сети. Ошибка не предотвращается путем использования одинарных или двойных кавычек вместо экранирования символов в командной строке.
Во-вторых,
if [ -z `iwlist wlan0 scan | grep -m 1 -o \"$1\"` ]; then
echo SSID \"$1\" not found;
показывает, что grep не находит строку, хотя тот же самый grep, введенный непосредственно в командной строке, находит 'BU (802.1x)'.
Как мне указать 1 доллар в двух вышеупомянутых обстоятельствах, чтобы он работал с моим сетевым SSID, содержащим пробелы и круглые скобки?
Спасибо.
2 ответа
Выход из iwconfig
ставит имя точки доступа в двойные кавычки, что приводит к некоторой странности. Автор сценария имеет дело с этим "артефактом" в своем сценарии, а не избавляется от него сразу. Я предлагаю удалить цитаты, прежде чем делать что-либо еще. Два возможных подхода будут:
$ eval moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' `
$ moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' |tr -d \"`
Первый выполняет оператор присваивания переменной "буквально", а другой удаляет двойные кавычки из выходной строки.
Вторая проблема со сценарием заключается в предположении, что можно использовать $LIST без кавычек (поскольку строка содержала бы двойные кавычки). Я думаю, что это ошибка, потому что строка по-прежнему оценивается как два токена:
$ moo='"aaa bbb"'
$ if [ $moo = "\"aaa bbb\""];then ok;fi
ash: bbb": unknown operand
$ if [ "$moo" = "\"aaa bbb\"" ];then echo ok;fi
ok
Чтобы это исправить, заключите параметры в квадратные скобки и избавьтесь от экранированных кавычек во втором аргументе (потому что мы удалили их из вывода iwconfig):
if [ "$LIST" = "$1" ]; then ...
Кроме того, чтобы передать строку с нерегулярным символом (пробел, скобка) в качестве одного аргумента скрипту, просто заключите его в кавычки:
$ autoconnect.sh "a name (with a comment)"
На последнюю часть о сопоставлении имени с grep уже должным образом ответил Гленн Джекман.
Примечание. Вышеуказанное было проверено на золе BusyBox (1.20.2).
Не пытайтесь добавлять буквальные кавычки. Тебе нужно if [ "$LIST" = "$1" ]; ...
, Обе переменные должны быть заключены в кавычки, поэтому тестовой команде дается ровно 3 аргумента - это особенно важно, потому что значения содержат пробелы.
Тот же совет для второго: if [ -z $(iwlist wlan0 scan | grep -m 1 -o "$1") ]; ...
Лучший способ написать выше: if iwlist wlan0 scan | grep -q "$1"; ...