Sé que este tema es antiguo, pero tengo una solución de trabajo más simple sin exportar las variables. Puede ser una sola línea, pero prefiero dividir usando \
al final de la línea.
var1='myVar1'\
var2=2\
var3=${var1}\
envsubst '$var1,$var3' < "source.txt" > "destination.txt"
# ^^^^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^
# define which to replace input output
Las variables deben definirse en la misma línea que envsubst
es ser considerado como variables de entorno.
El '$var1,$var3'
es opcional reemplazar solo los especificados. Imagine un archivo de entrada que contenga ${VARIABLE_USED_BY_JENKINS}
que no debe ser reemplazado.
En referencia a la respuesta 2, al hablar sobre envsubst, usted preguntó:
¿Cómo puedo hacer que funcione con las variables declaradas en mi script .sh?
La respuesta es que simplemente necesita exportar sus variables antes de llamar a envsubst
.
También puede limitar las cadenas de variables que desea reemplazar en la entrada usando el envsubst
SHELL_FORMAT
argumento (evitando el reemplazo no deseado de una cadena en la entrada con un valor de variable de shell común, por ejemplo, $HOME
).
Por ejemplo:
export VAR1='somevalue' VAR2='someothervalue'
MYVARS='$VAR1:$VAR2'
envsubst "$MYVARS" <source.txt >destination.txt
Reemplazará todas las instancias de $VAR1
y $VAR2
(y solo VAR1
y VAR2
) en source.txt
con 'somevalue'
y 'someothervalue'
respectivamente.
Mirando, resulta que en mi sistema hay un envsubst
comando que es parte del paquete gettext-base.
Entonces, esto lo hace fácil:
envsubst < "source.txt" > "destination.txt"
Tenga en cuenta que si desea usar el mismo archivo para ambos, tendrá que usar algo como sponge
de moreutil , según lo sugerido por Johnny Utahh:envsubst < "source.txt" | sponge "source.txt"
. (Debido a que la redirección de shell vaciará el archivo antes de leerlo).