请求方法作为函数中的参数不能正常工作

时间:2018-01-12 09:18:30

标签: shell curl jq

这是一个执行给定URL的GET请求的函数

mycurl() {
curl -X GET \
     -H 'Accept: application/vnd.layer+json; version=3.0' \
     -H 'Authorization: Bearer qFyBLjM9mhOlIwjZCeblbV9CrLZh2rqNzVIlIuf8a07UBj5F' \
     -H 'Content-Type: application/json' \
    "$@"}

exportsData=$(mycurl https://api.layer.com/apps/9d649224-cde5-11e7-b916-f3d1a15f96fe/exports)
count=$(jq -r '.|length' <<<"$exportsData")
echo $count;

这会将计数打印一次:

30

我正在尝试将mycurl函数转换为接受请求方法作为参数,如此

mycurl() {
curl -X "$@" \
     -H 'Accept: application/vnd.layer+json; version=3.0' \
     -H 'Authorization: Bearer qFyBLjM9mhOlIwjZCeblbV9CrLZh2rqNzVIlIuf8a07UBj5F' \
     -H 'Content-Type: application/json' \
    "$@"}
exportsData=$(mycurl GET https://api.layer.com/apps/9d649224-cde5-11e7-b916-f3d1a15f96fe/exports)
count=$(jq -r '.|length' <<<"$exportsData")
echo $count;

以上的输出是

curl: (6) Could not resolve host: GET
100 52280  100 52280    0     0  39425      0  0:00:01  0:00:01 --:--:-- 10742
30 30

问题是什么?为什么计数被打印两次?

1 个答案:

答案 0 :(得分:1)

您需要将第一个参数与函数mycurl()中的其余参数分开。捕获$1并使用shift一次传递其余参数,如下所示

mycurl() {
    reqMethod=$1; shift

    curl -X "$reqMethod" \
         -H 'Accept: application/vnd.layer+json; version=3.0' \
         -H 'Authorization: Bearer qFyBLjM9mhOlIwjZCeblbV9CrLZh2rqNzVIlIuf8a07UBj5F' \
         -H 'Content-Type: application/json' \
         "$@"
}

原因是$@表示传递给函数脚本的所有位置参数,如果将它传递给-X则不正确。因此,我们将第一个参数存储在变量中,shift调用现在将保留除$1之外的其余参数,然后可以将其传递给实际curl

此外,如果您只确定脚本的两个参数,请求方法只需$1,传递URL只需$2