Pregunta ¿Cómo verificar si una variable está configurada en Bash?


¿Cómo puedo saber si una variable está configurada en Bash?

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

function a {
    # if $1 is set ?
}

1067
2017-08-30 14:54


origen


Respuestas:


(Por lo general) La forma correcta

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

dónde ${var+x} es un expansión de parámetros que se evalúa a nada si var está desarmado, y sustituye la cadena x de otra manera.

Quotes Digression

Las citas se pueden omitir (por lo que podemos decir ${var+x} en lugar de "${var+x}") porque esta sintaxis y uso garantiza que esto solo se expandirá a algo que no requiera comillas (ya que se expande a x (que no contiene ningún salto de palabra, por lo que no necesita comillas), o para nada (lo que da como resultado [ -z ], que convenientemente evalúa al mismo valor (verdadero) que [ -z "" ] también lo hace)).

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

(A menudo) La manera incorrecta

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

Esto a menudo es incorrecto porque no distingue entre una variable que está desarmada y una variable que está configurada en la cadena vacía. Es decir, si var='', entonces la solución anterior dará como resultado "var está en blanco".

La distinción entre unset y "set to the empty string" es esencial en situaciones donde el usuario tiene que especificar una extensión, o una lista adicional de propiedades, y que no especificarlas tiene un valor predeterminado no vacío, mientras que especificar la cadena vacía debería hacer que el script use una extensión vacía o una lista de propiedades adicionales.

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


1596
2017-12-13 17:04



Para comprobar la variable de cadena no nula / no nula, es decir, si se establece, utilice

if [ -n "$1" ]

Es lo opuesto a -z. Me encuentro usando -n mas que -z.


650
2017-08-30 15:17



Aquí se muestra cómo probar si un parámetro es desarmado, o vacío ("nulo") o establecer con un valor:

+--------------------+----------------------+-----------------+-----------------+
|                    |       parameter      |     parameter   |    parameter    |
|                    |   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 que se muestra. En todos los casos que se muestran con "assign", el parámetro se asigna a ese valor, que también reemplaza la expresión.


389
2018-05-25 20:20



Hay muchas maneras de hacer esto, siendo el siguiente uno de ellos:

if [ -z "$1" ]

Esto tiene éxito si $ 1 es nulo o desarmado


168
2017-08-30 15:00



Si bien la mayoría de las técnicas indicadas aquí son correctas, bash 4.2 admite una prueba real para la presencia de una variable (hombre bash), en lugar de probar el valor de la variable.

[[ -v foo ]]; echo $?
# 1

foo=bar
[[ -v foo ]]; echo $?
# 0

foo=""
[[ -v foo ]]; echo $?
# 0

145
2017-07-09 02:28



Para ver si una variable no está vacía, utilizo

if [[ $var ]]; then ...       # `$var' expands to a nonempty string

Lo contrario prueba si una variable está desarmada o vacía:

if [[ ! $var ]]; then ...     # `$var' expands to the empty string (set or not)

Para ver si una variable está configurada (vacía o no), uso

if [[ ${var+x} ]]; then ...   # `var' exists (empty or nonempty)
if [[ ${1+x} ]]; then ...     # Parameter 1 exists (empty or nonempty)

Lo opuesto prueba si una variable no está configurada:

if [[ ! ${var+x} ]]; then ... # `var' is not set at all
if [[ ! ${1+x} ]]; then ...   # We were called with no arguments

54
2018-05-08 08:32



Siempre encuentro la tabla POSIX en el otra respuesta lento para asimilar, así que aquí está mi opinión:

   +----------------------+------------+-----------------------+-----------------------+
   |   if VARIABLE is:    |    set     |         empty         |        unset          |
   +----------------------+------------+-----------------------+-----------------------+
 - |  ${VARIABLE-default} | $VARIABLE  |          ""           |       "default"       |
 = |  ${VARIABLE=default} | $VARIABLE  |          ""           | $(VARIABLE="default") |
 ? |  ${VARIABLE?default} | $VARIABLE  |          ""           |       exit 127        |
 + |  ${VARIABLE+default} | "default"  |       "default"       |          ""           |
   +----------------------+------------+-----------------------+-----------------------+
:- | ${VARIABLE:-default} | $VARIABLE  |       "default"       |       "default"       |
:= | ${VARIABLE:=default} | $VARIABLE  | $(VARIABLE="default") | $(VARIABLE="default") |
:? | ${VARIABLE:?default} | $VARIABLE  |       exit 127        |       exit 127        |
:+ | ${VARIABLE:+default} | "default"  |          ""           |          ""           |
   +----------------------+------------+-----------------------+-----------------------+

Tenga en cuenta que cada grupo (con y sin colon anterior) tiene el mismo conjunto y desarmado casos, entonces lo único que difiere es cómo vacío los casos son manejados

Con los dos puntos anteriores, vacío y desarmado los casos son idénticos, así que los usaría cuando sea posible (es decir, uso :=, No solo =, porque el caso vacío es inconsistente).

Encabezados:

  • conjunto medio VARIABLE no está vacío (VARIABLE="something")
  • vacío medio VARIABLE está vacío / nulo (VARIABLE="")
  • desarmado medio VARIABLE no existe (unset VARIABLE)

Valores:

  • $VARIABLE significa que el resultado es el valor original de la variable.
  • "default" significa que el resultado fue la cadena de reemplazo provista.
  • "" significa que el resultado es nulo (una cadena vacía).
  • exit 127 significa que el script deja de ejecutarse con el código de salida 127.
  • $(VARIABLE="default") significa que el resultado es el valor original de la variable y la cadena de reemplazo proporcionada se asigna a la variable para uso futuro.

30
2018-06-17 15:19