jq:用 -r 取纯文本,少处理一层引号

49 次浏览1 条回复

用 jq 从 JSON 里拿字符串时,默认输出还是 JSON 字符串,会带引号。写 shell 小脚本时通常更想要纯文本,可以加 -r。

环境:jq 1.6+。随便建个文件试一下:

mkdir jq-raw-demo && cd jq-raw-demo
printf '{"name":"meshboard","port":3000}
' > app.json

jq '.name' app.json
jq -r '.name' app.json

第一行会输出:

"meshboard"

第二行是:

meshboard

如果要拼到变量里,-r 会少很多转义上的麻烦:

name=$(jq -r '.name' app.json)
printf 'app=%s\n' "$name"

拿数字、对象这些类型时就不用硬加,按输出要给谁用来选就行。

还有个小坑可以顺手提一下:字段不存在时,jq -r '.name' app.json 会输出 null 这几个字。

如果后面要直接拼命令,我一般会写成:

name=$(jq -r '.name // empty' app.json)

这样缺字段时就是空字符串,脚本里再判断 -n "$name" 会更直观一点。