我使用 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”视为单个实体。
答案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[@]}"
必须像此处所示的那样精确引用,否则 shell 会在每个值中包含的任何空格或制表符上拆分每个值(并对生成的字符串执行文件名通配)。
如果您想将 JSON 字符串传递给您的 Java 代码(问题中不清楚),请-r
从jq
.这会将字符串传递给java
命令,就像参数已被写入-i '"Name 1"' -i '"Name 2"'
等一样,参数中包含文字双引号。这消除了值不能包含嵌入的换行符或 NUL 的限制nameField
(因为它们将分别编码为\n
和\u0000
)。