jq 不接受“.”line”作为有效语法 - “意外的 INVALID_CHARACTER”

Jam*_*mes 2 linux macos bash shell json

我正在尝试在 bash 文件中使用curl 发出 GET 请求。\n因此我调用curl,并从我的服务器获取JSON 响应,然后我尝试获取作为响应一部分的对象,并且我这样做了所以使用jq,这样我就可以打印该值。\n但它不起作用。

\n\n

我的回应是这样的:

\n\n
{"line":"Azul", "id":"j3453j45n35", "lat":"39.091937", "long":"-9.265441"}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 bash 脚本:

\n\n
#!/bin/bash\nwhile :\ndo\n    cmd=$(curl -i -H "Content-Type: application/json" http://localhost:8080/cards/exists/1 | jq \xe2\x80\x98.\xe2\x80\x9dline\xe2\x80\x9d\xe2\x80\x99) \n    sleep 2\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
\n

jq: 错误:语法错误,意外的 INVALID_CHARACTER,期望 $end (Unix shell 引用问题?),第 1 行:\n \xe2\x80\x98.\xe2\x80\x9dline\xe2\x80\x9d\xe2\x80 \x99\n jq: 1 编译错误\n (23) 写入正文失败

\n
\n\n

出了什么问题?\n我遵循了人们在网上建议的大量响应,但我不断收到相同的响应。\n我的 json 对象似乎是正确的。\n我正在 MacOS Sierra 上运行此文件

\n

mkl*_*nt0 5

您的代码有两个问题:

\n\n
    \n
  • 您正在使用非 ASCII 引号( \xe2\x80\x98 \xe2\x80\x9d \xe2\x80\x9d \xe2\x80\x99),它jq无法理解:

    \n\n
      \n
    • 将它们替换为 ASCII 等效项:\' " " \'
    • \n
    • TextEdit.app在 macOS 上,避免使用打开“智能引号”功能的标准文本编辑器,或通过菜单系统关闭该功能: Edit > Substitutions > Smart Quotes
      \n正是此功能取代了 ASCII 引用字符。当您键入 时,使用它们的非 ASCII 印刷等效项。
    • \n
    • 一般来说,考虑使用专用的源代码编辑器来编辑代码,例如 Visual Studio Code(免费)或 Atom(免费)或 Sublime Text(付费)。
    • \n
  • \n
  • 您的curl命令包含标头输出 ( -i),该jq输出会阻塞 - 只需省略-i

  • \n
\n\n\n\n
#!/bin/bash\n\nwhile :; do\n    cmd=$(curl -H \'Content-Type: application/json\' \'http://localhost:8080/cards/exists/1\' |\n            jq \'.line\') \n    sleep 2\ndone\n
Run Code Online (Sandbox Code Playgroud)\n\n

虽然\'."line"\'也可以,但不需要对这样的简单属性名称进行额外的引用。

\n\n

另外,最好将要在shell 中按字面解释的字符串括起来。\'...\'

\n