miércoles, 19 de abril de 2017

Símbolos perdidos o inesperados

Otro error común es olvidarse de completar un comando compuesto, como if o while. Veamos qué ocurre si eliminamos el punto y coma tras el test en el comando if:

#!/bin/bash

# trouble: script to demonstrate common errors

number=1

if [ $number = 1 ] then
    echo "Number is equal to 1."
else
    echo "Number is not equal to 1."
fi

El resultado es:

[me@linuxbox ~]$ trouble
/home/me/bin/trouble: line 9: syntax error near unexpected token `else'
/home/me/bin/trouble: line 9: `else'

De nuevo, el mensaje de error apunta a un error que ocurre más tarde que el problema real. Lo que ocurre es realmente interesante. Como dijimos, if acepta una lista de comandos y evalúa el código de salida del último comando de la lista. En nuestro programa, nuestra intención es que esta lista sea un único comando, [, un sinónimo de test. El comando [ toma lo que le sigue como una lista de argumentos; en nuestro caso, cuatro argumentos: $number, 1, =, y ]. Con el punto y coma eliminado, se añade la palabra then a la lista de argumentos, lo que es sintácticamente legal. El siguiente comando echo también es legal. Se interpreta como otro comando en la lista de comandos que if evaluará como código de salida. A continuación encontramos else, pero está fuera de sitio, ya que el shell lo reconoce como una palabra reservada (una palabra que tiene un significado especial para el shell) y no como el nombre de un comando, de ahí el mensaje de error.

No hay comentarios:

Publicar un comentario