好的,这可能是一个愚蠢的问题。我有test.json
文件:
{
"timestamp": 1234567890,
"report": "AgeReport"
}
我要做的是提取timestamp
和report
值并将它们存储在一些env变量中:
export $(cat test.json | jq -r '@sh "TIMESTAMP=\(.timestamp) REPORT=\(.report)"')
结果是:
echo $TIMESTAMP $REPORT
1234567890 'AgeReport'
问题在于那些单引号会破坏其他命令。 如何去除那些单引号?
答案 0 :(得分:3)
为什么要使用eval
使其复杂而又引述混乱?而是简单地通过将变量与NULL(\u0000
)结合来发出变量,然后在shell环境中将其读回
{
IFS= read -r -d '' TIMESTAMP
IFS= read -r -d '' REPORT
} < <(jq -r '(.timestamp|tostring) + "\u0000" + .report + "\u0000"' test.json)
这通过使字段由NULL分隔符连接而使解析更加健壮,而NULL分隔符不能成为字符串序列的一部分。
答案 1 :(得分:2)
在jq手册页中,@sh
命令将其输入转换为
已转义,适合在POSIX shell的命令行中使用。
因此,您可以尝试在jq内生成整个命令行,然后使用eval
来执行该操作,而不是尝试将jq的输出拼接到shell的export命令中,而这需要仔细删除一些引号。 >
eval "$(
cat test.json |\
jq -r '@sh "export TIMESTAMP=\(.timestamp) REPORT=\(.report)"'
)"