업데이트

업데이트

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_apiUrland 로 호출됩니다 $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

추가 읽기

관련 정보