Atualizar

Atualizar

Estou tentando substituir tokens em um arquivo JSON por valores mantidos em nossa ferramenta de CI preferida (Bamboo).

Para fazer isso, estou usando jqpara extrair uma matriz de valuese, em seguida, substituindo o token em cada valor pelo valor da variável Bamboo correspondente.

No entanto, algo não está funcionando. A saída no script confirma que o token de substituição está sendo encontrado e que o valor da variável Bamboo está correto.

O que estou fazendo de errado?

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

Exemplo de arquivo JSON

Abaixo está um exemplo do arquivo JSON antes de ser editado com sed.

Como você pode ver, existem tokens de substituição para cada um value, e são eles que estou tentando substituir pelas variáveis ​​do Bamboo. Neste caso, essas variáveis ​​seriam chamadas $bamboo_apiUrle $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"
}

Atualizar

Com base em uma sugestão nos comentários, esta é a solução que estou 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

Responder1

Você citou variáveis ​​com aspas simples, mas:

Colocar caracteres entre aspas simples preserva o valor literal de cada caractere entre aspas.

Você não quer isso, você quer $ter um significado especial para o shell para avaliar as variáveis. Portanto, use aspas duplas:

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

Na verdade, nenhum dos “s”, “/” ou “g”requercitando, então dependendo do conteúdo da variável você pode até deixar a expressão inteira sem aspas. No entanto, é sempre aconselhável citar variáveis.

Você pode testar facilmente os efeitos de sua cotação acrescentando echo, basta adicionar estas duas linhas e comparar a saída:

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

Leitura adicional

informação relacionada