Cómo comprobar si una variable está configurada en Bash
¿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 ?
}
(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 var
no está configurado y, x
en 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.
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 -n
más de -z
.
Lo usarías como:
if [ -n "$1" ]; then
echo "You supplied the first parameter!"
else
echo "First parameter not supplied."
fi
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 | "" |
+--------------------+----------------------+-----------------+-----------------+