저는 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"
"Name
2"
"이름 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