He estado mirando algunos scripts que otras personas escribieron (específicamente Red Hat), y muchas de sus variables se asignan usando la siguiente notación
 VARIABLE1="${VARIABLE1:-some_val}"
o algunas expanden otras variables
VARIABLE2="${VARIABLE2:-`echo $VARIABLE1`}"
¿Cuál es el punto de usar esta notación en lugar de declarar los valores directamente (por ejemplo, VARIABLE1=some_val)?
¿Hay beneficios para esta notación o posibles errores que podrían evitarse?
¿Tiene el :-significado específico en este contexto?
                    
                        bash
                                shell-script
                                scripting
                                variable
                                
                    
                    
                        Rothgar
fuente
                
                fuente

man bash; busque el bloque "Expansión de parámetros" (aproximadamente el 28%). Estas asignaciones son, por ejemplo, funciones predeterminadas: "Use el valor predeterminado solo si aún no se ha configurado ninguno".Respuestas:
Esta técnica permite que a una variable se le asigne un valor si otra variable está vacía o no está definida. NOTA: Esta "otra variable" puede ser la misma u otra variable.
extracto
NOTA: este formulario también funciona
${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 la wiki de Bash Hacker titulada: " Expansión de parámetros ".Ejemplos
la variable no existe la variable existeLo mismo se puede hacer evaluando otras variables o ejecutando comandos dentro de la parte del valor predeterminado de la notación.
Más ejemplos
También puede usar una notación ligeramente diferente donde es justo
VARX=${VARX-<def. value>}.En lo anterior
$VAR1y$VAR2ya estaban definidos por la cadena "tiene otro valor", pero$VAR3no estaba definido, por lo que se utilizó el valor predeterminado en su lugar,0.Otro ejemplo
Comprobación y asignación mediante
:=notaciónPor último voy a mencionar el operador práctico,
:=. Esto hará una verificación y asignará un valor si la variable bajo prueba está vacía o indefinida.Ejemplo
Observe que
$VAR1ahora está configurado. El operador:=realizó la prueba y la asignación en una sola operación.Sin embargo, si el valor se establece antes, entonces se deja solo.
Handy Dandy Reference Table
Referencias
fuente
bash. El${var:-word}de la Q es, pero no el${var-word}anterior. Sin embargo, la documentación POSIX tiene una buena tabla, podría valer la pena copiarla en esta respuesta - pubs.opengroup.org/onlinepubs/9699919799/utilities/…echo "${FOO:=default}"es genial si realmente quieres elecho. Pero si no lo hace, intente con el:incorporado ...: ${FOO:=default}Su$FOOestá configuradodefaultcomo arriba (es decir, si no está configurado). Pero no hay eco$FOOen el proceso.${4:-$VAR}will funcionará.@slm ya ha incluido los documentos POSIX , que son muy útiles, pero en realidad no amplían la forma en que estos parámetros se pueden combinar para afectarse entre sí. Todavía no hay ninguna mención aquí de este formulario:
Este es un extracto de otra respuesta mía, y creo que demuestra muy bien cómo funcionan:
Otro ejemplo de lo mismo :
El ejemplo anterior aprovecha las 4 formas de sustitución de parámetros POSIX y sus diversas
:colon nullonot nullpruebas. Hay más información en el enlace de arriba, y aquí está de nuevo .Otra cosa que la gente a menudo no considera
${parameter:+expansion}es cuán útil puede ser en un documento aquí. Aquí hay otro extracto de una respuesta diferente :PARTE SUPERIOR
Aquí establecerá algunos valores predeterminados y se preparará para imprimirlos cuando se llame ...
MEDIO
Aquí es donde define otras funciones para llamar a su función de impresión en función de sus resultados ...
FONDO
Ya lo tiene todo configurado, así que aquí es donde ejecutará y extraerá sus resultados.
RESULTADOS
Analizaré por qué en un momento, pero ejecutar lo anterior produce los siguientes resultados:
CÓMO FUNCIONA:
La característica clave aquí es el concepto de
conditional ${parameter} expansion.Puede establecer una variable en un valor solo si no está establecida o es nula utilizando el formulario:Si, en cambio, desea establecer solo una variable no establecida, omitirá los
:colonvalores nulos y permanecerá como está.EN ALCANCE:
Puede notar eso en el ejemplo anterior
$PLACEy$RESULTcambiarlo cuando se configura a través deparameter expansionaunque_top_of_script_pr()ya se haya llamado, presumiblemente configurándolos cuando se ejecuta. La razón por la que esto funciona es que_top_of_script_pr()es una( subshelled )función: la incluí enparenslugar de la{ curly braces }utilizada para los demás. Debido a que se llama en una subshell, cada variable que establece eslocally scopedy cuando regresa a su shell principal esos valores desaparecen.Pero cuando se
_more_important_function()establece$ACTIONesglobally scopedasí, afecta a la_less_important_function()'ssegunda evaluación de$ACTIONporque_less_important_function()establece$ACTIONsolo a través de${parameter:=expansion}.fuente
Experiencia personal.
A veces utilizo este formato en mis scripts para anular los valores ad-hoc, por ejemplo, si tengo:
Puedo correr:
sin tener que cambiar el valor predeterminado original de
SOMETHING.fuente