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 :-
Me has salvado la vida compañero. Necesitaba saber si un script no devolvía nada y lo he solucionado con esta info.
ResponderEliminarHe 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
Adelante José, me alegra que el artículo te haya sido útil, esa era la idea!
EliminarUn saludo,