使用jq解析JSON遇Invalid numeric literal错误,为何加单引号可解决?
问题原因解析
核心问题出在shell的命令解析顺序上:
- 当你执行
echo {"ok":true,"elapsed":"317ns"} | jq -r '.ok'时,shell会先解析{...}部分——shell里的大括号{}是用于brace扩展的语法,里面的逗号会被当作分隔符,把{"ok":true,"elapsed":"317ns"}拆成两个独立的字符串:{"ok":true和"elapsed":"317ns"}。 - 这时候
echo实际输出的内容是{"ok":true "elapsed":"317ns"}(两个部分之间有空格),这显然不是合法的JSON格式,所以jq会抛出解析错误。
而用单引号包裹JSON字符串时:
- 单引号在shell里是强引用,会屏蔽所有特殊字符的解析(包括大括号、逗号、空格等),shell会把整个
'{"ok":true,"elapsed":"317ns"}'当作一个完整的参数传给echo,输出的就是标准合法的JSON,自然能被jq正确解析。
另外补充一个小技巧:如果不想用单引号,也可以对特殊字符转义,比如echo \{\"ok\":true,\"elapsed\":\"317ns\"\} | jq -r '.ok',但这种写法可读性差,不如直接用单引号方便。
内容的提问来源于stack exchange,提问作者v_ns
相关产品推荐
相关产品推荐

