scripting de cenizas: la variable que contiene espacio se niega a ser asimilada

3

Estoy tratando de ejecutar el script que se encuentra en http://talk.maemo.org/showthread.php?t=70866&page=2 en su hardware previsto, un teléfono Nokia Linux que ejecuta BusyBox ash. La secuencia de comandos recibe el nombre de la red WiFi como parámetro e intenta conectar el teléfono a ella. Sospecho que el script funciona, pero mi SSID, BU (802.1x) , tiene espacio y paréntesis. Entonces, cuando escribo en el símbolo del sistema

autoconnect.sh BU\ \(802.1x\)

Recibo varios errores. Primero,

LIST=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}'`
if [ $LIST = "\"$1\"" ]; then

... falla, incluso yo estoy conectado a la red. El error no se evita utilizando comillas simples o dobles en lugar de caracteres de escape en el símbolo del sistema.

Segundo,

if [ -z `iwlist wlan0 scan | grep -m 1 -o \"$1\"` ]; then
    echo SSID \"$1\" not found;

muestra que grep no encuentra la cadena, aunque el mismo grep, escrito directamente en el símbolo del sistema, encuentra 'BU (802.1x)' .

¿Cómo cotizo $ 1 en las dos circunstancias anteriores para que funcione con mi SSID de red, que contiene espacios y paréntesis?

Gracias.

Nick Alexander
fuente

Respuestas:

2

La salida de iwconfigpone el nombre del punto de acceso entre comillas dobles, lo que conduce a cierta rareza. El autor del guión trata este "artefacto" en su guión en lugar de deshacerse de él de inmediato. Sugiero eliminar las comillas antes de hacer cualquier otra cosa. Dos posibles enfoques serían:

$ eval moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' `
$ moo=`iwconfig wlan0 | awk -F":" '/ESSID/{print $2}' |tr -d \"`

El primero ejecuta la instrucción de asignación de variables "literalmente", mientras que el otro elimina las comillas dobles de la cadena de salida.

El segundo problema con el script radica en el supuesto de que está bien usar $ LIST sin citarlo (ya que la cadena habría contenido comillas dobles). Creo que esto es un error porque la cadena aún se evalúa como dos tokens:

$ moo='"aaa bbb"'
$ if [ $moo = "\"aaa bbb\""];then ok;fi
ash: bbb": unknown operand

$  if [ "$moo" = "\"aaa bbb\"" ];then echo ok;fi
ok

Para solucionar esto, cite los parámetros entre corchetes y elimine las comillas escapadas en el segundo argumento (porque las eliminamos de la salida de iwconfig):

if [ "$LIST" = "$1" ]; then ...

Además, para pasar una cadena con caracteres irregulares (espacio, paréntesis) como un argumento a un script, solo cítelo:

$ autoconnect.sh "a name (with a comment)"

Glenn Jackman ya respondió adecuadamente la última parte sobre la coincidencia del nombre con grep.

Nota: Lo anterior se probó con ceniza BusyBox (1.20.2).

Ярослав Рахматуллин
fuente
Gracias, desearía poder marcar ambas respuestas como aceptadas. Ambos funcionaron muy bien, o al menos eso parece. Por desgracia, el script nunca tiene éxito, porque la siguiente línea es un awk que requiere que se escape cada espacio. Lo publicaremos como una pregunta separada.
Nick Alexander
1

No intentes agregar citas literales. Es necesario if [ "$LIST" = "$1" ]; .... Ambas variables deben ser citadas para que el comando de prueba reciba exactamente 3 argumentos, esto es particularmente importante porque los valores contienen espacios.

El mismo consejo para el segundo: if [ -z $(iwlist wlan0 scan | grep -m 1 -o "$1") ]; ...

La mejor manera de escribir lo anterior: if iwlist wlan0 scan | grep -q "$1"; ...

Glenn Jackman
fuente