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": []} ' )"
任何暗示如果粘贴它的内容,为什么它不能使用位置参数呢?
谢谢!
答案 0 :(得分:2)
当您将JSON字符串作为参数传递时,它会将单引号中包含的内容指定为整个字符串,但是当您将其传递给curl时,它会受到单词拆分。
要显示它的外观,这是一个示例脚本来演示它。
此脚本将接收字符串并将其传递给第二个脚本。
#!/bin/bash
./params $1
这第二个脚本模拟curl看到的内容。它将打印它接收的参数数量。
#!/bin/bash
echo $#
猜猜输出是什么:
27
要修复问题并使其更简单,请删除最外面的引号并引用$()
内的所有内容。
OUTPUT=$(curl -s -H "Content-Type: application/json" "$path" -d "$4" )