En circunstancias normales, ${FOO-}
se comporta exactamente igual que ${FOO}
.
Sin embargo, con set -u
, la expansión de las variables no establecidas se convierte en un error por defecto.
Entonces ${FOO}
podría ser un error, pero ${FOO-}
nunca lo será.
Variables dentro de un ${...}
se denominan «Expansión de parámetros».
Busque ese término en el manual en línea o en el manual real (línea 792).
El ${var-}
form es similar en forma a ${var:-}
. La diferencia se explica solo una línea antes del :-
expansión (línea 810):
... bash prueba un parámetro que no está establecido o es nulo. Omitir los dos puntos da como resultado una prueba solo para un parámetro que no está configurado.
Por lo tanto, este formulario está probando solo cuando una variable no está configurada (y no nulo), y reemplaza toda la expansión ${...}
para el valor después del -
, que en este caso es null .
Por lo tanto, el ${var-}
se convierte en:
- El valor de var cuando var tiene un valor (y no nulo).
- También el valor de var (¡faltan los dos puntos!) cuando var es nulo:
''
, por lo tanto:también nulo. - El valor después de - (en este caso, nulo
''
) si var no está configurado.
Todo eso es realmente:
- Expandir a
''
cuando var no está configurado o es nulo. - Expandir al valor de var (cuando var tiene un valor).
Por lo tanto, la expansión no cambia nada sobre el valor de var, ni su expansión, solo evita un posible error si el shell tiene la opción nounset
establecer.
Este código se detendrá en ambos usos de $var
:
#!/bin/bash
set -u
unset var
echo "variable $var"
[[ $var ]] && echo "var set"
Sin embargo, este código se ejecutará sin error:
#!/bin/bash
set -u
unset var
echo "variable ${var-}"
[[ ${var-} ]] && echo "var set"