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
$VAR1
y$VAR2
ya estaban definidos por la cadena "tiene otro valor", pero$VAR3
no 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
$VAR1
ahora 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$FOO
está configuradodefault
como arriba (es decir, si no está configurado). Pero no hay eco$FOO
en 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 null
onot null
pruebas. 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
:colon
valores nulos y permanecerá como está.EN ALCANCE:
Puede notar eso en el ejemplo anterior
$PLACE
y$RESULT
cambiarlo cuando se configura a través deparameter expansion
aunque_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í enparens
lugar de la{ curly braces }
utilizada para los demás. Debido a que se llama en una subshell, cada variable que establece eslocally scoped
y cuando regresa a su shell principal esos valores desaparecen.Pero cuando se
_more_important_function()
establece$ACTION
esglobally scoped
así, afecta a la_less_important_function()'s
segunda evaluación de$ACTION
porque_less_important_function()
establece$ACTION
solo 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