Mostrando entradas con la etiqueta bash variables sin definir. Mostrar todas las entradas
Mostrando entradas con la etiqueta bash variables sin definir. Mostrar todas las entradas

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 :-