martes, 29 de marzo de 2011

Barajita premiada (#23) - variables vacías o sin definir en bash

Recientemente tuve que hacer un script de bash, que entre tantas cosas, en un momento determinado debía validar y diferenciar si una variable existía o no tenía valor (era vacía).

Para resolver el problema descubrí dos operadores que desconocía...

#!/bin/bash

# a equals empty string (var instance exists)
a=""
echo "${a-NO_INSTANCE}"
echo "${a:-NO_VALUE}"

# a equals full string (var instance exists)
a="hello"
echo "${a-NO_INSTANCE}"
echo "${a:-NO_VALUE}"

# b not exists as var
echo "${b-NO_INSTANCE}"
echo "${b:-NO_VALUE}"


Al ejecutar el script verá una salida como la siguiente:

$ ./checkBashVars.sh 

NO_VALUE
hello
hello
NO_INSTANCE
NO_VALUE

En la salida mostrada arriba se puede ver que:
  • El operador "-": devuelve el valor de la variable (VAR) si existe, no importa si es vacía. En caso de no existir, devuelve el valor alternativo (VALOR).
  • El operador ":-": devuelve el valor de la variable (VAR) si existe y tiene valor (no es vacía). En caso de no existir, devuelve el valor alternativo (VALOR).

Un ejemplo para mostrar dónde se puede utilizar esto: imaginemos que tenemos un documento con identificadores, otro con registros (un CSV) donde estos identificadores están presentes y la idea es conocer cuál de los identificadores no está en el documento.

Identificadores:
$ cat ids
1
2
3

Fuente, CSV:
$ cat source
1|nice|bad
2|welcome|bye
1|tokio|caracas

Script que retornará los ids que no están presentes en el documento fuente (CSV):
#!/bin/bash

cat ids |
while read id; do
        match="`grep $id'|' $source`"

        if [ "${match:-NULL}" = "NULL" ]; then
                echo $id 
        fi
done

La salida:
$ ./script.sh 
1

El script mostrado arriba, busca dentro del archivo fuente (source) cada uno de los id contenidos en el archivo de ids y en el momento en que no consigue registros, porque el grep sobre el archivo retorna "NULL", imprime el id. Puede ver que el NULL es impreso utilizando el operador :-



2 comentarios:

  1. Me has salvado la vida compañero. Necesitaba saber si un script no devolvía nada y lo he solucionado con esta info.

    He explicado esto mismo en mi blog: http://jose-linares.com/bash-scripting-comprobar-si-una-variable-esta-vacia-o-instanciada/

    No sé que licencia tienes y no se si tengo permiso para hacerlo. Si no te parece bien, dímelo y retiro el post.

    Muchas gracias y un saludo

    ResponderEliminar
    Respuestas
    1. Adelante José, me alegra que el artículo te haya sido útil, esa era la idea!

      Un saludo,

      Eliminar