如何正确构造一个bash命令参数?

时间:2014-05-22 10:19:52

标签: bash curl

我正在编写一个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."
}

我的方法有什么明显的错误,甚至更好,我可以输出命令的方式,因为我逐字逐句地知道我的命令是如何构建的?

1 个答案:

答案 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"'

时则不需要它们