yq를 사용하여 yaml 파일의 값을 바꿉니다.

yq를 사용하여 yaml 파일의 값을 바꿉니다.

Powershell에서 yq 버전 4.34.1을 사용하고 있습니다.

in 값을 변수의 새 값으로 바꾸려고 합니다 .spec.source.targetRevision. 그래서 제가 지금 하고 있는 일은 다음과 같습니다.target.yaml$newTargetRevision

$newTargetRevision = "v1.1.1-1"
yq -i '.spec.source.targetRevision = "$newTargetRevision"' target.yaml

내가 얻는 것은 다음과 같습니다.

spec:
  source:
    targetRevision: &default $newTargetRevision

나는 다음을 얻을 것으로 예상합니다 :-

spec:
  source:
    targetRevision: &default v1.1.1-1

또한 아래와 같이 큰따옴표를 제거하려고 시도했지만 $newTargetRevisionyaml 파일의 값이 전혀 업데이트되지 않습니다.

yq -i '.spec.source.targetRevision = $newTargetRevision' target.yaml

나는 성공하지 못한 채 많은 것을 시도했습니다. 뭔가 제안해주실 수 있나요?

감사해요

답변1

문제는 쉘이 변수를 작은 따옴표로 묶은 문자열의 값으로 확장할 것으로 기대하고 있다는 것입니다. 이는 Unix 쉘에서는 수행되지 않는 일입니다. 가장 중요한 점은 변수 값에 큰따옴표와 같은 특정 문자가 포함되어 있지 않다고 가정한다는 것입니다.

Mike Farah의 유틸리티를 사용하여 셸 변수 값을 YAML 문서에 올바르게 삽입(주입하는 대신)하려면 환경에서 변수 값을 읽을 yq수 있습니다 .env()

newrevision=$newTargetRevision \
yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml

이렇게 하면 환경 변수가 newrevision변수 값으로 설정되고 newTargetRevision내부 편집 중에 문서의 올바른 위치에서 수정됩니다. 변수를 내보내고 newTargetRevision이름을 env().

시험:

$ cat target.yaml
spec:
  source:
    targetRevision: &default v1.0
$ newTargetRevision='v1.1 "kangaroo"'
$ newrevision=$newTargetRevision yq -i '.spec.source.targetRevision = env(newrevision)' target.yaml
$ cat target.yaml
spec:
  source:
    targetRevision: &default v1.1 "kangaroo"

답변2

드디어 이해가 되네요. 다음은 powershell에서 잘 작동합니다.

yq -i ".spec.source.targetRevision = `"${newTargetRevision}`"" target.yaml

관련 정보