我正在编写一个Bash脚本来构造curl命令的参数以与API接口。
以下命令工作正常,即使从我的bash脚本运行时也是如此:
curl "https://www.site.com/api" -H "username:user" -H "token:3028c67e929221bb9993847eba6bc038" -H "Content-Type:undefined" -X POST --data '{"user_id":"me","name":"a","subject_id":"a","build":"hg18","file_format":"vcf","notifyByEmail":"Y"}'
所以我尝试使用以下Bash脚本构建JSON组件:
ANNOTATION_INIT_NAME="GELG00000000003"
ANNOTATION_INIT_SUBJECT="GELG00000000003"
ANNOTATION_INIT_PROJECT="4"
ANNOTATION_INIT_BUILD="hg19"
ANNOTATION_INIT_FAMILY="0"
ANNOTATION_INIT_DATA="'{\"user_id\":\"me\",\"name\":\"$ANNOTATION_INIT_NAME\",\"subject_id\":\"$ANNOTATION_INIT_SUBJECT\",\"project\":\"$ANNOTATION_INIT_PROJECT\",\"build\":\"$ANNOTATION_INIT_BUILD\",\"family_id\":\"$ANNOTATION_INIT_FAMILY\",\"file_format\":\"vcf\",\"notifyByEmail\":\"N\"}'"
echo $ANNOTATION_INIT_DATA
ANNOTATION_INIT=$(curl "https://www.site.com/api" $AUTH_HEADERS -H "Content-Type:undefined" -X POST --data $ANNOTATION_INIT_DATA)
回应$ANNOTATION_INIT_DATA
揭示了我正在寻找的内容:
'{"user_id":"me","name":"","subject_id":"GELG00000000003","project":"4","build":"hg19","family_id":"0","file_format":"vcf","notifyByEmail":"N"}'
但最终调用会返回错误:
{
"error": "Missing required field, user_id."
}
我的方法有什么明显的错误,甚至更好,我可以输出命令的方式,因为我逐字逐句地知道我的命令是如何构建的?
答案 0 :(得分:4)
您需要引用$ANNOTATION_INIT_DATA
:
ANNOTATION_INIT=$(curl "https://www.site.com/api" $AUTH_HEADERS -H "Content-Type:undefined" -X POST --data "$ANNOTATION_INIT_DATA")
否则变量内的空格将被解释为curl的附加参数。
编辑:另外,正如@ jonathan-leffler所述:'ANNOTATION_INIT_DATA
中嵌入的单引号不是必需的。当你按字面输入参数时需要它们,但是当它被写成--data "$ANNOTATION_INIT_DATA"
'