jq:错误:语法错误,意外的 IDENT,期望 $end (Unix shell 引用问题?)位于 <top-level>

K. *_*Zhu 7 variables shell syntax-error jq

cat explorer/connection-profile/test-network.json | jq ".organizations.Org1MSP.adminPrivateKey.path |= 44ab"

jq: error: syntax error, unexpected IDENT, expecting $end (Unix shell quoting issues?) at <top-level>, line 1:
.organizations.Org1MSP.adminPrivateKey.path|=44ab                                               
jq: 1 compile error
Run Code Online (Sandbox Code Playgroud)

但它工作得很好

cat explorer/connection-profile/test-network.json | jq ".organizations.Org1MSP.adminPrivateKey.path |= 44"
Run Code Online (Sandbox Code Playgroud)

为什么?

实际上我正在尝试使用

cat explorer/connection-profile/test-network.json | jq ".organizations.Org1MSP.adminPrivateKey.path |= ${PRIV_KEY}"
Run Code Online (Sandbox Code Playgroud)

其中 ${PRIV_KEY} 是 44ab..._sk

Sha*_*awn 10

您可以将字符串分配给可在jq过滤器内使用的变量:

PRIV_KEY="44ab..._sk"
jq --arg path "$PRIV_KEY" '.organizations.Org1MSP.adminPrivateKey.path |= $path' explorer/connection-profile/test-network.json 
Run Code Online (Sandbox Code Playgroud)

此方法比尝试将扩展的 shell 变量直接嵌入到过滤字符串中更安全,因为jq它将正确处理任意值,而不是因引号(或它们的缺失)等内容而阻塞。


请注意,jq在过滤器表达式之后将文件名作为参数;这里不需要cat(当然,除非它代表curl什么,并且您没有使用现有文件)