jueves, 20 de abril de 2017

Expansiones inesperadas

Es posible tener errores que sólo ocurren de forma intermitente en un script. A veces el script se ejecutará correctamente y otras veces fallará debido al resultado de una expansión. Si devolvemos nuestro punto y coma perdido y cambiamos el valor de number a una variable vacía, podemos comprobarlo:

#!/bin/bash

# trouble: script to demonstrate common errors

number=

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

Ejecutar el script con este cambio da como resultado esta salida:

[me@linuxbox ~]$ trouble
/home/me/bin/trouble: line 7: [: =: unary operator expected
Number is not equal to 1.

Obtenemos un mensaje de error bastante críptico, seguido de la salida del segundo comando echo. El problema es la expansión de la variable number dentro del comando test. Cuando el comando:

[ $number = 1 ]

se somete a la expansión con number estando vacío, el resultado es este:

[ = 1 ]

que no es válido y se genera el error. El operador = es un operador binario (requiere un valor a cada lado), pero el primer valor no está, así que el comando test espera un operador unario (como -Z) en su lugar. Además, como el test ha fallado (debido al error), el comando if recibe un código de salida distinto de cero y actúa de acuerdo con esto, y se ejecuta el segundo comando echo.

Este problema puede corregirse añadiendo comillas alrededor del primer argumento en el comando test:

[ "$number" = 1 ]

De esta forma cuando se produce la expansión, el resultado será este:

[ "" = 1 ]

que proporciona el número correcto de argumentos. Además de para las cadenas vacías, las comillas deben usarse en casos donde un valor puede expandirse en cadenas multipalabra, como nombres de archivo que contengan espacios.

No hay comentarios:

Publicar un comentario