Cómo comprobar si una variable está configurada en Bash

Resuelto prosseek asked hace 14 años • 38 respuestas

¿Cómo sé si una variable está configurada en Bash?

Por ejemplo, ¿cómo verifico si el usuario le dio el primer parámetro a una función?

function a {
    # if $1 is set ?
}
prosseek avatar Aug 30 '10 21:08 prosseek
Aceptado

(Por lo general) La manera correcta

if [ -z ${var+x} ]; then echo "var is unset"; else echo "var is set to '$var'"; fi

donde ${var+x}hay una expansión de parámetro que no se evalúa como nada si varno está configurado y, xen caso contrario, sustituye la cadena.

Citas digresión

Las comillas se pueden omitir (por lo que podemos decir ${var+x}en lugar de "${var+x}") porque esta sintaxis y uso garantizan que esto solo se expandirá a algo que no requiera comillas (ya que se expande a x(que no contiene saltos de palabra, por lo que no necesita comillas) o a nada (lo que resulta en [ -z ], que convenientemente se evalúa con el mismo valor (verdadero) que [ -z "" ]también)).

Sin embargo, si bien las comillas se pueden omitir con seguridad, y no fue inmediatamente obvio para todos (ni siquiera fue evidente para el primer autor de esta explicación de citas, que también es un importante codificador de Bash), a veces sería mejor escribir la solución. con comillas como [ -z "${var+x}" ], al costo muy pequeño posible de una penalización de velocidad O(1). El primer autor también agregó esto como un comentario junto al código que usa esta solución, brindando la URL de esta respuesta, que ahora también incluye la explicación de por qué las comillas se pueden omitir de manera segura.

(A menudo) De la manera equivocada

if [ -z "$var" ]; then echo "var is blank"; else echo "var is set to '$var'"; fi

Esto suele ser incorrecto porque no distingue entre una variable que no está configurada y una variable que está configurada en la cadena vacía. Es decir, si var='', entonces la solución anterior generará "var está en blanco".

La distinción entre no establecido y "establecido en la cadena vacía" es esencial en situaciones en las que el usuario tiene que especificar una extensión o una lista adicional de propiedades, y al no especificarlas, el valor predeterminado es un valor no vacío, mientras que al especificar la cadena vacía debería haga que el script use una extensión vacía o una lista de propiedades adicionales.

Sin embargo, es posible que la distinción no sea esencial en todos los escenarios. En esos casos [ -z "$var" ]estará bien.

Lionel avatar Dec 13 '2012 17:12 Lionel

Para verificar si hay una variable de cadena que no sea nula o distinta de cero, es decir, si está configurada, use

if [ -n "$1" ]

Es lo contrario de -z. Me encuentro usando -nmás de -z.

Lo usarías como:

if [ -n "$1" ]; then
  echo "You supplied the first parameter!"
else
  echo "First parameter not supplied."
fi
mbrannig avatar Aug 30 '2010 15:08 mbrannig

A continuación se explica cómo probar si un parámetro no está configurado , está vacío ("Nulo") o está configurado con un valor :

+--------------------+----------------------+-----------------+-----------------+
|   Expression       |       parameter      |     parameter   |    parameter    |
|   in script:       |   Set and Not Null   |   Set But Null  |      Unset      |
+--------------------+----------------------+-----------------+-----------------+
| ${parameter:-word} | substitute parameter | substitute word | substitute word |
| ${parameter-word}  | substitute parameter | substitute null | substitute word |
| ${parameter:=word} | substitute parameter | assign word     | assign word     |
| ${parameter=word}  | substitute parameter | substitute null | assign word     |
| ${parameter:?word} | substitute parameter | error, exit     | error, exit     |
| ${parameter?word}  | substitute parameter | substitute null | error, exit     |
| ${parameter:+word} | substitute word      | substitute null | substitute null |
| ${parameter+word}  | substitute word      | substitute word | substitute null |
+--------------------+----------------------+-----------------+-----------------+

Fuente: POSIX: Expansión de parámetros :

En todos los casos que se muestran con "sustituto", la expresión se reemplaza con el valor mostrado. En todos los casos que se muestran con "assign", al parámetro se le asigna ese valor, que también reemplaza la expresión.

Para mostrar esto en acción:

+--------------------+----------------------+-----------------+-----------------+
|   Expression       |  When FOO="world"    |  When FOO=""    |    unset FOO    |
|   in script:       |  (Set and Not Null)  |  (Set But Null) |     (Unset)     |
+--------------------+----------------------+-----------------+-----------------+
| ${FOO:-hello}      | world                | hello           | hello           |
| ${FOO-hello}       | world                | ""              | hello           |
| ${FOO:=hello}      | world                | FOO=hello       | FOO=hello       |
| ${FOO=hello}       | world                | ""              | FOO=hello       |
| ${FOO:?hello}      | world                | error, exit     | error, exit     |
| ${FOO?hello}       | world                | ""              | error, exit     |
| ${FOO:+hello}      | hello                | ""              | ""              |
| ${FOO+hello}       | hello                | hello           | ""              |
+--------------------+----------------------+-----------------+-----------------+
Jens avatar May 25 '2013 20:05 Jens