jq 출력에서 ​​공백을 구분하지 마십시오.

jq 출력에서 ​​공백을 구분하지 마십시오.

저는 jq를 사용하여 단어 배열을 Java 프로그램의 매개변수로 변환하고 있습니다.

그것은 마치

arguments=$(jq '.nameField | "-i " + "\"" + . + "\""' file.json)

java .... $arguments  <-- No quotes wrapped around arguments.

예상 출력:Java는 로 읽어야 하며 -i "Name 1" -i "Name 2", " Name 1"는 완전한 매개변수로 읽어야 합니다.

출력을 수신: Java는 읽는 동안 및 "Name각각 오류를 발생시킵니다 .1""Name2"

"이름 1"을 단일 엔터티로 처리하고 싶습니다.

답변1

매개변수를 배열에 저장해야 합니다.

.nameField 값에 개행 문자가 포함되지 않는다고 가정합니다.

readarray -t arguments < <(jq -r '.nameField | "-i", .' file.json)

java ... "${arguments[@]}"

jq명령은 "-i"를 실행하고 각 이름을 별도의 줄에 배치하여 readarray해당 줄을 배열로 읽습니다.

바라보다명령을 변수에 넣으려고 했지만 복잡한 경우는 항상 실패합니다!


코드가 제대로 작동하려면 가 필요 eval java ... $arguments하지만 일반적으로 권장되지 않습니다.

답변2

이 시도:

eval "arguments=($(jq -r '.nameField | ["-i", .] | @sh' file.json))"
java ... "${arguments[@]}"

답변3

입력 JSON 파일의 최상위 수준에 배열이 아닌 다음과 같은 여러 개체가 포함되어 있다고 가정합니다.

{"nameField":"Name 1"}
{"nameField":"Name 2"}
{"nameField":"Name 3"}
{"nameField":"Name 4"}
{"nameField":"Name 5"}

...그리고 nameField값에 새 줄(또는 NUL)이 포함되어 있지 않은 경우 jq모든 값을 추출하고 다음을 사용하여 bash배열을 구성합니다 arguments.

arguments=()
while IFS= read -r name; do
    arguments+=( -i "$name" )
done < <( jq -r '.nameField' file.json )

그런 다음 배열을 확장할 때 Java 코드를 호출합니다.

java ... "${arguments[@]}"

확장은 "${arguments[@]}"여기에 표시된 대로 정확하게 인용되어야 합니다. 그렇지 않으면 쉘은 각 값에 포함된 공백이나 탭에서 각 값을 분할합니다(그리고 결과 문자열에 대해 파일 이름 글로빙을 수행합니다).

JSON 문자열을 Java 코드에 전달하려면(질문에서 명확하지 않음) -r에서 이 작업을 수행하십시오. 그러면 매개 변수에 리터럴 큰따옴표가 포함된 매개 변수가 작성된 것처럼 jq문자열이 명령에 전달됩니다 . 이는 값에 삽입된 줄바꿈 또는 NUL을 포함할 수 없다는 제한을 제거합니다 (각각 및 로 인코딩됨 ).java-i '"Name 1"' -i '"Name 2"'nameField\n\u0000

관련 정보