Usei jq para converter um array de palavras em um argumento para um programa java.
é como
arguments=$(jq '.nameField | "-i " + "\"" + . + "\""' file.json)
java .... $arguments <-- No quotes wrapped around arguments.
Saída esperada : Java deve ser lido como -i "Name 1" -i "Name 2"
e " Name 1
" deve ser lido como um argumento completo.
Saída recebida : Java gera erro ao ler "Name
, e separadamente.1"
"Name
2"
Quero considerar "Nome 1" uma entidade única.
Você precisa armazenar os argumentos em uma matriz.
Supondo que o valor .nameField nunca contenha uma nova linha:
O
jq
comando emite o “-i” e cada nome em linhas separadas; oreadarray
comando lê as linhas em um array.Veja , estou tentando colocar um comando em uma variável, mas os casos complexos sempre falham!
Para que seu código funcione, você precisará de
eval java ... $arguments
, o que geralmente não é recomendadoExperimente isto:
Supondo que o arquivo JSON de entrada contenha vários objetos em seu nível superior, não em um array, mas assim:
... e que nenhum
nameField
valor contém novas linhas incorporadas (ou NULs), usejq
para extrair todos os valores e construir umabash
matriz,arguments
, assim:Em seguida, chame seu código Java enquanto expande o array:
Observe que a expansão
"${arguments[@]}"
deve ser citada precisamente como mostrado aqui, ou o shell dividiria cada valor em qualquer espaço ou tabulação incluída em cada valor (e executaria globbing de nome de arquivo nas strings geradas).Se você deseja passar strings JSON para o seu código Java (não está claro na pergunta), remova a
-r
opção da invocação dejq
. Isso passaria as strings para ojava
comando como se os argumentos tivessem sido escritos,-i '"Name 1"' -i '"Name 2"'
etc., com aspas duplas literais incluídas nos argumentos. Isso elimina a limitação de que umnameField
valor não pode incluir novas linhas ou NULs incorporados (já que estes seriam codificados como\n
e\u0000
respectivamente).