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
and 로 호출됩니다 $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
. 다음 두 줄을 추가하고 출력을 비교하세요.
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
/인용문(인용문은 거기서 따왔습니다)