변수를 jq로 가져오기

변수를 jq로 가져오기

다음 명령에서는 $domain_name문자열 대신 변수를 사용해야 합니다.hyb.comjq

jq --argjson IDS '['"$(seq -s, -f'"car%02.0f_hyb.com"' 11)"']' '
  .mazda |= $IDS
' file.json

변수를 다음과 같이 설정할 때

export domain_name=_hyb.com

jq --argjson IDS '['"$(seq -s, -f'"car%02.0f$domain_name "' 11)"']' '
  .mazda |= $IDS
' file.json

그러면 내보낸 변수가 domain_name표시되지 않습니다 jq. 변수를 로 가져오는 방법에 대한 제안 사항이 있습니까 jq?

답변1

$domain_name작은따옴표로 사용합니다. 이것이 쉘이 변수를 확장하지 않는 이유입니다.

하지만 이 경우에는 약간 다른 접근 방식을 권장합니다.

jq셸에서 원시 데이터를 가져오는 안전한 방법을 제공합니다.

jq '.mazda |= $ARGS.positional' file.json --args car{00..11}"$domain_name"

mazda그러면 목록에서 가져온 값을 사용하여 명령줄에 키가 삽입됩니다 . 값 --args목록은 --args명령줄 끝에 있어야 합니다. 필요한 경우 이러한 값은 JSON으로 인코딩됩니다 jq. 이는 일반적으로 외부 소스에서 제공될 수 있는 데이터에서 올바른 JSON을 직접 생성하는 것보다 낫습니다. 예를 들어 삽입하는 데이터에 탭, 줄 바꿈 또는 큰따옴표가 포함된 경우 이 데이터는 다음을 사용하여 jqJSON 문자열로 올바르게 인코딩됩니다 . --args.

목록은 중괄호 확장을 사용하여 생성됩니다. bash버전 4 이상을 사용한다고 가정하면 생성된 숫자는 {00..11}0으로 올바르게 채워집니다.

domain_name환경(내보낸) 변수일 필요는 없습니다 .

답변2

귀하의 주요 문제는 입력의 변수를 사용하지 jq않고 seq.

즉, @muru의 의견은 정확하며 문제도 지적합니다."작은따옴표 안에 변수 내부의 값을 인쇄할 수 있는 방법이 있나요?"seq- 당신은 그것을 사용하는 방법을 알고 있음을 증명했습니다. 당신은 그것을 사용하여 의 출력을 탈출했습니다 jq.

그러나 실제로 입력에 작은 따옴표를 사용할 필요가 없기 때문에 문제는 더 간단한 방법으로 해결될 수 있습니다 seq. 입력 값에 큰 따옴표를 사용하고 싶기 때문에 그렇게 한다고 생각하지만 쉽게 이스케이프할 수 있습니다. :

seq -s, -f "\"car%02.0f${domain_name}\"" 11

관련 정보