He estado mirando algunos scripts que escribieron otras personas (específicamente Red Hat), y muchas de sus variables se asignan usando la siguiente notaciónVARIABLE1="${VARIABLE1:-some_val}"
o algunos expanden otras variablesVARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
¿Cuál es el punto de usar esta notación en lugar de simplemente declarar los valores directamente (por ejemplo, VARIABLE1=some_val
)?
¿Existen beneficios para esta notación o posibles errores que se evitarían?
¿El :-
tienen un significado específico en este contexto?
Respuesta aceptada:
Esta técnica permite asignar un valor a una variable si otra variable está vacía o no está definida.
extracto
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted.
Otherwise, the value of parameter is substituted.
${parameter-word}
. Si desea ver una lista completa de todas las formas de expansión de parámetros disponibles en Bash, le sugiero que eche un vistazo a este tema en el wiki de Bash Hacker titulado:"Expansión de parámetros".
Ejemplos
la variable no existe
$ echo "$VAR1"
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
default value
existe variable
$ VAR1="has value"
$ echo "$VAR1"
has value
$ VAR1="${VAR1:-default value}"
$ echo "$VAR1"
has value
Se puede hacer lo mismo evaluando otras variables o ejecutando comandos dentro de la parte del valor predeterminado de la notación.
$ VAR2="has another value"
$ echo "$VAR2"
has another value
$ echo "$VAR1"
$
$ VAR1="${VAR1:-$VAR2}"
$ echo "$VAR1"
has another value
Más ejemplos
También puede usar una notación ligeramente diferente donde es simplemente VARX=${VARX-<def. value>}
.
$ echo "${VAR1-0}"
has another value
$ echo "${VAR2-0}"
has another value
$ echo "${VAR3-0}"
0
En el anterior $VAR1
&$VAR2
ya estaban definidos con la cadena "tiene otro valor" pero $VAR3
no estaba definido, por lo que se utilizó el valor predeterminado, .
Otro ejemplo
$ VARX="${VAR3-0}"
$ echo "$VARX"
0
Comprobación y asignación usando :=
notación
Por último mencionaré el práctico operador, :=
. Esto hará una verificación y asignará un valor si la variable bajo prueba está vacía o indefinida.
Ejemplo
Observe que $VAR1
ahora está configurado. El operador :=
hizo la prueba y la asignación en una sola operación.
$ unset VAR1
$ echo "$VAR1"
$ echo "${VAR1:=default}"
default
$ echo "$VAR1"
default
Sin embargo, si el valor se establece antes, se deja solo.
$ VAR1="some value"
$ echo "${VAR1:=default}"
some value
$ echo "$VAR1"
some value
Tabla de referencia Handy Dandy
Relacionado:¿Construir un comando poniendo una cadena en un tty?
Referencias
- Expansiones de parámetros - Bash Hackers Wiki
- 10.2. Sustitución de parámetros
- Expansiones de parámetros de Bash