在Bash脚本中使用curl发送数据:位置参数无效

时间:2017-07-07 22:07:57

标签: json bash curl

BASH的总菜单。想学习。 我有以下bash脚本来发出API请求:

#!/bin/bash
if [ $1 = "new_event" ]; then
    a='https://www.googleapis.com/calendar/v3/calendars/'
    b=$2
    c='/events?access_token='
    d=$3
    path=$a$b$c$d

    echo $4

  OUTPUT="$(curl -s -H "Content-Type: application/json" $path -d $4 )"
  echo "${OUTPUT}"
fi

位置参数是" new_event',calendarId,访问令牌和json字符串。 如果我运行脚本,我会得到:

  • 第一个echo是我在调用中作为参数传递的json字符串:

    ' {"guestsCanSeeOtherGuests": false, "location": "", "description": "TEST", "reminders": {"useDefault": false}, "start": {"dateTime": "2017-07-06T14:00:00", "timeZone": "America/Sao_Paulo"}, "end": {"dateTime": "2017-07-06T15:00:00", "timeZone": "America/Sao_Paulo"}, "guestsCanInviteOthers": false, "summary": "TEST", "status": "tentative", "attendees": []} '
    
  • 第二个回显给我解析错误。

但是,如果我复制了回显的json字符串并为其替换了$ 4,那么一切正常。

OUTPUT="$(curl -s -H "Content-Type: application/json" $path -d ' {"guestsCanSeeOtherGuests": false, "location": "", "description": "TEST", "reminders": {"useDefault": false}, "start": {"dateTime": "2017-07-06T14:00:00", "timeZone": "America/Sao_Paulo"}, "end": {"dateTime": "2017-07-06T15:00:00", "timeZone": "America/Sao_Paulo"}, "guestsCanInviteOthers": false, "summary": "TEST", "status": "tentative", "attendees": []} ' )"

任何暗示如果粘贴它的内容,为什么它不能使用位置参数呢?

谢谢!

1 个答案:

答案 0 :(得分:2)

当您将JSON字符串作为参数传递时,它会将单引号中包含的内容指定为整个字符串,但是当您将其传递给curl时,它会受到单词拆分。

要显示它的外观,这是一个示例脚本来演示它。

此脚本将接收字符串并将其传递给第二个脚本。

#!/bin/bash
./params $1

这第二个脚本模拟curl看到的内容。它将打印它接收的参数数量。

#!/bin/bash
echo $#

猜猜输出是什么:

27

要修复问题并使其更简单,请删除最外面的引号并引用$()内的所有内容。

OUTPUT=$(curl -s -H "Content-Type: application/json" "$path" -d "$4" )