Actualizar

Actualizar

Estoy intentando reemplazar tokens en un archivo JSON con valores contenidos en nuestra herramienta de CI de elección (Bamboo).

Para hacer esto, estoy usando jqpara extraer una matriz de valuesy luego reemplazando el token en cada valor con su valor de variable de Bamboo correspondiente.

Sin embargo, algo no funciona. El resultado del script confirma que se está encontrando el token de reemplazo y que el valor de la variable Bamboo es correcto.

¿Qué estoy haciendo mal?

ENV_FILE_PATH="./landmark-accounts-uat.postman_environment.json"
VALUES=$(cat ./landmark-accounts-uat.postman_environment.json | jq -c '.values[]')
for ELEMENT in $VALUES; do

        ### Extract the variable name and replacement token (e.g. '#{varName}') for the current element.
        ELEMENT_NAME=$(echo $ELEMENT | jq -r '.key')
        ELEMENT_REPLACEMENT_TOKEN=$(echo $ELEMENT | jq -r '.value')

        ### Construct the name of the Bamboo variable to use for replacement.
        BAMBOO_VARIABLE_NAME=bamboo\_$ELEMENT_NAME
        BAMBOO_VARIABLE_VALUE=${!BAMBOO_VARIABLE_NAME}

        ### Replace the current value with the value of the Bamboo variable.
        echo "Replacing '$ELEMENT_REPLACEMENT_TOKEN' with the value of Bamboo variable '$BAMBOO_VARIABLE_NAME' ($BAMBOO_VARIABLE_VALUE)."
        sed -i 's/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g' $ENV_FILE_PATH
done

Archivo JSON de ejemplo

A continuación se muestra un ejemplo del archivo JSON antes de editarlo con sed.

Como puede ver, hay tokens de reemplazo para cada uno value, y son estos los que estoy tratando de reemplazar con variables de Bamboo. En este caso, esas variables se llamarían $bamboo_apiUrly $bamboo_apimKey.

{
  "id": "b10a67a9-75a1-49fc-8b6d-9063388ed35c",
  "name": "my-env",
  "values": [
    {
      "key": "apiUrl",
      "value": "#{apiUrl}",
      "enabled": true
    },
    {
      "key": "apimKey",
      "value": "#{apimKey}",
      "enabled": true
    },
  ],
  "_postman_variable_scope": "environment",
  "_postman_exported_at": "2019-09-27T09:13:43.208Z",
  "_postman_exported_using": "Postman/7.8.0"
}

Actualizar

Según una sugerencia de los comentarios, esta es la solución que estoy usando.

#!/bin/bash

### Read in the environment file in full.
ENV_FILE_PATH="./landmark-accounts-uat.postman_environment.json"
ENVIRONMENT_FILE=$(cat $ENV_FILE_PATH)

### Get all of the value keys from the environment file.
KEYS=$(cat $ENV_FILE_PATH | jq --raw-output '.values[].key')

### Iterate value keys...
for KEY in $KEYS; do
        ### Construct the name of the Bamboo variable to use for 'value' for the current 'key', then get the value of that variable.
        BAMBOO_VARIABLE_NAME=bamboo\_$KEY
        BAMBOO_VARIABLE_VALUE=${!BAMBOO_VARIABLE_NAME}

        ### Replace the value for the currently 'key'.
        echo "Replacing value of key '$KEY' with the value of Bamboo variable '$BAMBOO_VARIABLE_NAME' ($BAMBOO_VARIABLE_VALUE)."
        ENVIRONMENT_FILE=$(echo $ENVIRONMENT_FILE | jq --arg key "$KEY" --arg value "$BAMBOO_VARIABLE_VALUE" '.values |= map(if .key == $key then .value = $value else . end)')
done

### Output the updated environment file.
echo $ENVIRONMENT_FILE > $ENV_FILE_PATH

Respuesta1

Citaste variables con comillas simples, pero:

Al encerrar caracteres entre comillas simples se conserva el valor literal de cada carácter entre comillas.

No quieres eso, quieres $tener su significado especial en el shell para poder evaluar las variables. Por lo tanto, utilice comillas dobles en su lugar:

sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH

De hecho, ninguna de las “s”, “/” o “g”requiereentre comillas, por lo que dependiendo del contenido variable puedes incluso dejar la expresión completa sin comillas. Sin embargo, siempre es recomendable citar variables.

Puede probar fácilmente los efectos de su cita anteponiendo echo, simplemente agregue estas dos líneas y compare el resultado:

echo sed -i 's/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g' $ENV_FILE_PATH
echo sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH

Otras lecturas

información relacionada