我使用 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"
。
我希望它将“Name 1”视为单个实体。
您需要将参数存储在数组中。
假设 .nameField 值从不包含换行符:
该
jq
命令在单独的行上发出“-i”和每个名称;该readarray
命令将行读入数组中。看到我试图将命令放入变量中,但复杂的情况总是失败!
为了使您的代码正常工作,您需要
eval java ... $arguments
,通常不推荐这样做尝试这个:
假设输入 JSON 文件在其顶层包含多个对象,而不是在数组中,而是如下所示:
...并且没有
nameField
值包含任何嵌入的换行符(或 NUL),然后使用jq
提取所有值并构造一个bash
数组,arguments
如下所示:然后在扩展数组时调用 Java 代码:
请注意,扩展
"${arguments[@]}"
必须像此处所示的那样精确引用,否则 shell 会在每个值中包含的任何空格或制表符上拆分每个值(并对生成的字符串执行文件名通配)。-r
如果您想将 JSON 字符串传递给您的 Java 代码(问题中不清楚),请从jq
. 这会将字符串传递给java
命令,就像参数已被写入-i '"Name 1"' -i '"Name 2"'
等一样,参数中包含文字双引号。这消除了值不能包含嵌入的换行符或 NUL 的限制nameField
(因为它们将分别编码为\n
和\u0000
)。