3

Я пытаюсь запустить сценарий, указанный по адресу 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 ответа2

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).

1

Не пытайтесь добавлять буквальные кавычки. Вам нужно if [ "$LIST" = "$1" ]; ... Обе переменные должны быть заключены в кавычки, поэтому тестовой команде дается ровно 3 аргумента - это особенно важно, потому что значения содержат пробелы.

Тот же совет для второго: if [ -z $(iwlist wlan0 scan | grep -m 1 -o "$1") ]; ...

Лучший способ написать выше: if iwlist wlan0 scan | grep -q "$1"; ...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .