如何在shell脚本

时间:2016-02-10 10:42:11

标签: json bash shell curl cfnetwork

我尝试按如下方式执行CURL语句,为此我得到了必需的响应:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "q_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

但是当我试图将变量值传递给参数“query”时,下面提到的curl语句不起作用,并在响应中观察到一些错误语句:

curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d '{"query": "$query_string", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'

错误声明:

  

未找到[CFN#0005]

它有效!

      

这是此服务器的默认网页。

      

网络服务器软件正在运行,但尚未添加任何内容。

      

但是我确定我用变量构建第二个的curl请求类似于我最初执行的相同curl请求。这是使用echo测试的,它用正确的值替换$ query_string。

我也试过另一种方法,其中我没有使用任何变量用于单个参数,而是我尝试如下:

a='{"query": "query_value", "results": [{"abstract": "abs_string", "title": "title_string"}, "mode": "value", "cache": true, "source": "value"}'
curl -s -POST --header 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d $a

我还尝试使用${a}"$a"'$a'

替换a的值

仍然观察到相同的错误。

1 个答案:

答案 0 :(得分:2)

单引号'(您在-d参数中使用)保留每个字符的字面值,包括$(请参阅this SO answer),这就是为什么您的变量query_string未展开。

试试这个:

~$ query_string="my query"

~$ echo '$query_string'
$query_string

~$ echo "$query_string"
my query

因此,如果您希望变量扩展到其值,则需要使用双引号"

但是,为了嵌套双引号(在其他双引号内),就像在JSON数据中一样,您必须:

  1. 转义内部引号,如下所示:

    ~$ echo "{\"query\": \"$query_string\"}"
    {"query": "my query"}
    

    但很快就会变得非常丑陋;或

  2. 在单引号和双引号交替下的
  3. 连接字符串,如下所示:

    ~$ echo '{"query": "'"$query_string"'"}"'
    {"query": "my query"}"
    

    对于较短的字符串可能更具可读性;或

  4. 使用 here-document

    ~$ read query <<-END
    {"query": "$query_string"}
    END
    
    ~$ echo "$query"
    {"query": "my query"}
    

    Here-documents对于您希望进行参数/变量扩展,命令替换,算术扩展等的较长文档特别方便。

  5. 总之,在使用上述方法之一(可能通过here-document)定义JSON查询之后,您可以像这样编写curl命令:

    curl -s -X POST -H 'Content-Type: application/json' 'http://www.dummy.com/projectname/page_relevance' -d "$query"