es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Exporta una cadena con una subcadena de un archivo con un script de shell (bash).

Tengo el archivo variables.tf:

variable "do_token" {
  description = "establece el valor del token DO"
  type        = string
}

variable "ssh<em>pub</em>key_fingerprint" {
  description = "Establece la huella digital de la clave ssh almacenada en DO"
  type        = string
}

...

<p>y quiero escribir un script para exportar los nombres de variables con descripciones como comentarios, al archivo <strong>terraform.tfvars</strong>. Pero la primera línea debe ser <strong>#description</strong>, y la segunda línea debe ser <strong>variable con valor vacío y comillas dobles</strong>, como esto:</p>

<p>“`
cat terraform.tfvars

establece el valor del token DO

do_token = “”

Establece la huella digital de la clave ssh almacenada en DO

sshpubkey_fingerprint = “”

Intenté escribir un script de bash test.sh así:

```shell

<h1>!/bin/bash</h1>

echo -n "" > test.txt
grep 'description\|variable' variables.tf | while read line; do
OUTPUT=$(echo $line | sed 's/ =//g; s/ {//g' );
# echo $OUTPUT
case "$OUTPUT" in

<em>description</em>)
DESCRIPTION=$(echo $OUTPUT | awk -F "\"" '{print $2}')
echo "#"$DESCRIPTION >> terraform.tfvars
;;

<em>variable</em>)
VARIABLE=$(echo $OUTPUT | awk -F "\"" '{print $2}')
echo $VARIABLE " = \"\"">> terraform.tfvars
;;
esac<br>
done
</code></pre>

<p>pero cuando muestro los valores del archivo <strong>terraform.tfvars</strong>, la línea es la primera y la línea de descripción es la segunda <strong>pero deben ser al revés</strong></p>

<p>```
do_token = ""

establece el valor del token DO

sshpubkey_fingerprint = ""

Establece la huella digital de la clave ssh almacenada en DO

```

¿Cómo puedo hacer esto correctamente? Gracias

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para lograr el orden deseado de las líneas en el archivo de salida, puedes almacenar los valores en variables temporales y luego imprimirlos con echo en el orden deseado. Aquí está una versión actualizada del script que debería funcionar:

    #!/bin/bash
    echo -n '' > terraform.tfvars
    while read -r line; do
        case "$line" in
            *description*)
                DESCRIPTION=$(echo "$line" | awk -F '"' '{print $2}')
                ;;
            *variable*)
                VARIABLE=$(echo "$line" | awk -F '"' '{print $2}')
                echo "$VARIABLE = \"\"" >> temp.tfvars
                ;;
            esac
    done < variables.tf
    
    paste -d "\n" <(grep description variables.tf | awk -F '"' '{print "#" $2}') \
                 <(cat temp.tfvars) >> terraform.tfvars
    
    rm temp.tfvars
    

    Este script crea un archivo temporal temp.tfvars para almacenar las asignaciones de variables con valores vacíos. Primero lee el archivo variables.tf línea por línea y extrae los nombres de las variables (VARIABLE) y las descripciones (DESCRIPTION) usando awk. Luego imprime las variables en temp.tfvars.

    Después de que se haya procesado el archivo variables.tf, se usa el comando paste para fusionar las líneas de dos archivos de entrada (<() es una sustitución de procesos). Las líneas resultantes se redirigen a terraform.tfvars.

    Usamos grep description para extraer las descripciones del archivo original variables.tf y las concatenamos con un #. Finalmente, eliminamos el archivo temporal temp.tfvars.

    Esto debería imprimir los valores en el orden deseado en el archivo de salida terraform.tfvars.

Comments are closed.