yq 명령으로 Bash 변수 대체

yq 명령으로 Bash 변수 대체

YAML 파일이 주어지면 다음과 같습니다 example.yaml.

node:
  sub_node:
    get_this:

get_thisMike Farah를 사용하여 문자열이 포함된 변수를 얻고 싶습니다 yq.sub_node

yaml="$(cat example.yaml)"
nodename=sub_node
sub_yaml= "$(echo "$yaml" | yq -r '.$nodename' )";
# also tried -> sub_yaml= "$(echo "$yaml" | yq -r '.'"$nodename" )";

이것은 인위적인 예입니다. 실제로는 문자열 sub_node을 미리 알 수 없으므로 교체해야 합니다 $nodename.

필수 작은따옴표 쿼리 문자열을 이스케이프 처리하는 방법을 알 수 없는 것 같습니다 yq.

어떻게 해야 합니까?

답변1

그리고마이크 파라yqnodename, 이 함수를 사용하면 다음과 같이 경로의 일부로 표현식에 넣어 유틸리티 환경 내에서 셸 변수 값에 액세스할 수 있습니다.yqstrenv()

$ nodename='sub_node' yq '.node[strenv(nodename)]' example.yaml
get_this:

node그러면 환경 변수 값에 의해 제공된 최상위 키의 하위 섹션에 액세스합니다 nodename.

이것피하다쉘 변수의 값을 yq표현식에 삽입합니다. 즉, 점과 기타 특수 문자가 포함된 이름 부분에 액세스할 수 있습니다.


사용안드레이 키슬류크yq, 다음과 같이 내부 변수를 통해 하위 키를 전달하여 유사한 작업을 수행할 수 있습니다.

$ nodename=sub_node
$ yq -y --arg sect "$nodename" '.node[$sect]' example.yaml
get_this: null

...또는 환경에서 값을 읽어서

$ nodename=sub_node yq -y '.node[$ENV.nodename]' example.yaml
get_this: null

답변2

ikkachu의 의견에서 언급했듯이 큰따옴표를 사용해야 합니다.

아이러니하게도 내 뒤의 공간 때문에 시행착오 노력이 효과가 없었다는 것이 밝혀졌다 =.

또한 위 예의 찾기 문자열을 수정해야 했습니다.

nodename=node.sub_node
sub_yaml="$(echo "$yaml" | yq -r ".$nodename" )";
echo $sub_yaml
get_this:

관련 정보