这是一个执行给定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
问题是什么?为什么计数被打印两次?
答案 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
。