JQ在保存环境变量的同时添加单引号

时间:2019-07-15 15:19:46

标签: environment-variables jq

好的,这可能是一个愚蠢的问题。我有test.json文件:

{
    "timestamp": 1234567890,
    "report": "AgeReport"
}

我要做的是提取timestampreport值并将它们存储在一些env变量中:

export $(cat test.json | jq -r '@sh "TIMESTAMP=\(.timestamp) REPORT=\(.report)"')

结果是:

echo $TIMESTAMP $REPORT
1234567890 'AgeReport'

问题在于那些单引号会破坏其他命令。 如何去除那些单引号?

注意:我将按原样保留已接受的答案,但请参见@Iniananswer以获取更好的解决方案。

2 个答案:

答案 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)"'
)"