'。“line”'不被jq接受为有效语法 - “意外的INVALID_CHARACTER”

时间:2017-05-01 20:28:26

标签: json linux bash macos shell

我正在尝试使用curl在bash文件中发出GET请求。 所以我调用curl,并从我的服务器获取JSON响应,并尝试获取对象,这是响应的一部分,我使用 jq ,所以我可以打印这个值。 但它不起作用。

我的回答是这样的:

{"line":"Azul", "id":"j3453j45n35", "lat":"39.091937", "long":"-9.265441"}

我的bash脚本:

#!/bin/bash
while :
do
    cmd=$(curl -i -H "Content-Type: application/json" http://localhost:8080/cards/exists/1 | jq ‘.”line”’) 
    sleep 2
done

结果:

  

jq:错误:语法错误,意外的INVALID_CHARACTER,期待$ end(Unix shell引用问题?)at第1行:   '。“线”'   jq:1编译错误   (23)写作身体失败

出了什么问题? 我跟随人们在网上建议的大量回复,但我一直得到同样的回应。 我的json对象似乎是正确的。 我在MacOS Sierra上运行此文件

1 个答案:

答案 0 :(得分:3)

您的代码存在两个问题:

  • 您正在使用非ASCII引号‘ ” ” ’),jq无法理解:

    • 将它们替换为等效的ASCII:' " " '
    • 在macOS上,请避免使用具有"智能引号"的标准TextEdit.app等文本编辑器。功能已打开,或通过菜单系统关闭该功能:Edit > Substitutions > Smart Quotes
      正是这个功能取代了ASCII引用字符。使用非ASCII,印刷等价物,键入
    • 通常,请考虑使用专用的源代码编辑器来编辑代码,例如Visual Studio Code(免费)或Atom(免费)或Sublime Text(付费)。
  • 您的curl命令包含标题输出(-i,其中jq扼流圈 - 只是省略了-i

#!/bin/bash

while :; do
    cmd=$(curl -H 'Content-Type: application/json' 'http://localhost:8080/cards/exists/1' |
            jq '.line') 
    sleep 2
done

虽然'."line"'也会起作用,但是对于像这样的简单属性名称,不需要额外的引用层。

另外,最好在shell中的'...'中包含您想要解释字面的字符串。