Ich versuche, Token in einer JSON-Datei durch Werte zu ersetzen, die in unserem bevorzugten CI-Tool (Bamboo) gespeichert sind.
Zu diesem Zweck verwende ich jq
zum Extrahieren eines Arrays von values
und ersetze dann das Token in jedem Wert durch den entsprechenden Bamboo-Variablenwert.
Allerdings funktioniert etwas nicht. Die Ausgabe des Skripts bestätigt, dass das Ersatztoken gefunden wird und dass der Wert der Bamboo-Variable korrekt ist.
Was mache ich falsch?
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
Beispiel einer JSON-Datei
Unten sehen Sie ein Beispiel der JSON-Datei, bevor sie mit bearbeitet wurde sed
.
Wie Sie sehen, gibt es für jedes Ersatztoken value
, und diese versuche ich durch Bamboo-Variablen zu ersetzen. In diesem Fall würden diese Variablen $bamboo_apiUrl
und heißen $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"
}
Aktualisieren
Aufgrund eines Vorschlags in den Kommentaren verwende ich diese Lösung.
#!/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
Antwort1
Sie haben Variablen in einfache Anführungszeichen gesetzt, aber:
Durch das Einschließen von Zeichen in einfache Anführungszeichen bleibt der Literalwert jedes Zeichens innerhalb der Anführungszeichen erhalten.
Das möchten Sie nicht, Sie möchten, $
dass die Shell die Variablen mit ihrer speziellen Bedeutung auswertet. Verwenden Sie daher stattdessen doppelte Anführungszeichen:
sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH
Tatsächlich ist weder „s“, „/“ noch „g“erfordertAnführungszeichen, sodass Sie je nach Variableninhalt möglicherweise sogar den gesamten Ausdruck ohne Anführungszeichen lassen. Es ist jedoch immer ratsam, Variablen in Anführungszeichen zu setzen.
Sie können die Wirkung Ihrer Anführungszeichen ganz einfach testen echo
, indem Sie voranstellen. Fügen Sie dazu einfach diese beiden Zeilen hinzu und vergleichen Sie die Ausgabe:
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
Weiterführende Literatur
- (meine) Erklärung zu Zitiermechanismen
man bash
/ZITAT(das Zitat stammt von dort)