JSON ファイル内のトークンを、選択した CI ツール (Bamboo) に保持されている値に置き換えようとしています。
これを実行するには、 を使用してjq
の配列を抽出しvalues
、各値のトークンを対応する Bamboo 変数値に置き換えます。
しかし、何かがうまくいっていないようです。スクリプトの出力では、置換トークンが見つかっており、Bamboo 変数の値が正しいことが確認されています。
何が間違っているのでしょうか?
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
JSONファイルの例
以下は、 で編集される前の JSON ファイルの例ですsed
。
ご覧のとおり、 それぞれに置換トークンがありvalue
、これらを Bamboo 変数で置き換えようとしています。この場合、それらの変数は および$bamboo_apiUrl
と呼ばれます$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"
}
アップデート
コメントでの提案に基づいて、これが私が使用している解決策です。
#!/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
答え1
変数を一重引用符で囲みましたが、
文字を一重引用符で囲むと、引用符内の各文字のリテラル値が保持されます。
それは望ましくありません。$
変数を評価するために、シェルに特別な意味を持たせたいのです。そのため、代わりに二重引用符を使用します。
sed -i "s/$ELEMENT_REPLACEMENT_TOKEN/$BAMBOO_VARIABLE_VALUE/g" $ENV_FILE_PATH
実際、「s」、「/」、「g」のいずれも必要引用符で囲む必要があるため、変数の内容によっては、式全体を引用符で囲まなくてもかまいません。ただし、変数は常に引用符で囲むことをお勧めします。
を前に付けることによって引用符の効果を簡単にテストできますecho
。次の 2 行を追加して出力を比較するだけです。
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
参考文献
- 引用メカニズムの(私の)説明
man bash
/引用(引用はそこから)