YAML 파일이 주어지면 다음과 같습니다 example.yaml
.
node:
sub_node:
get_this:
get_this
Mike 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
그리고마이크 파라yq
nodename
, 이 함수를 사용하면 다음과 같이 경로의 일부로 표현식에 넣어 유틸리티 환경 내에서 셸 변수 값에 액세스할 수 있습니다.yq
strenv()
$ 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: