다음 명령에서는 $domain_name
문자열 대신 변수를 사용해야 합니다.hyb.com
jq
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을 직접 생성하는 것보다 낫습니다. 예를 들어 삽입하는 데이터에 탭, 줄 바꿈 또는 큰따옴표가 포함된 경우 이 데이터는 다음을 사용하여 jq
JSON 문자열로 올바르게 인코딩됩니다 . --args
.
목록은 중괄호 확장을 사용하여 생성됩니다. bash
버전 4 이상을 사용한다고 가정하면 생성된 숫자는 {00..11}
0으로 올바르게 채워집니다.
domain_name
환경(내보낸) 변수일 필요는 없습니다 .
답변2
귀하의 주요 문제는 입력의 변수를 사용하지 jq
않고 seq
.
즉, @muru의 의견은 정확하며 문제도 지적합니다."작은따옴표 안에 변수 내부의 값을 인쇄할 수 있는 방법이 있나요?"seq
- 당신은 그것을 사용하는 방법을 알고 있음을 증명했습니다. 당신은 그것을 사용하여 의 출력을 탈출했습니다 jq
.
그러나 실제로 입력에 작은 따옴표를 사용할 필요가 없기 때문에 문제는 더 간단한 방법으로 해결될 수 있습니다 seq
. 입력 값에 큰 따옴표를 사용하고 싶기 때문에 그렇게 한다고 생각하지만 쉽게 이스케이프할 수 있습니다. :
seq -s, -f "\"car%02.0f${domain_name}\"" 11