我正在编写一个函数,它将进行 REST API 调用,可以是GET
、PUT
、DELETE
、POST
等。
我想将此方法作为参数提供给函数,并将其添加到该单个函数调用的选项数组中。这可能吗?
目前我正在通过创建一个单独的local
数组来解决这个问题,但更愿意只使用单个options
数组。
#!/bin/bash
options=(
--user me:some-token
-H "Accept: application/json"
)
some_func () {
local urn=$1
shift
local func_opts=("${options[@]}" "$@")
printf '%s\n' "${func_opts[@]}"
}
# This should return all options including -X GET
some_func /test -X GET
# This should return only the original options
printf '%s\n' "${options[@]}"
我还可以使用临时数组来存储 的内容options
,添加新选项,然后在函数结束之前重置它,但我认为这也不是一个特别干净的方法。
答案1
在 bash 5.0 及更高版本中,您可以使用localvar_inherit
导致local
行为类似于基于 ash 的 shell 的选项,即使local var
变量成为本地变量而不更改其值或属性:
shopt -s localvar_inherit
options=(
--user me:some-token
-H "Accept: application/json"
)
some_func () {
local urn=$1
shift
local options # make it local, does not change the type nor value
options+=("$@")
printf '%s\n' "${options[@]}"
}
some_func /test -X GET
对于任何版本,您还可以执行以下操作:
some_func () {
local urn=$1
shift
eval "$(typeset -p options)" # make a local copy of the outer scope's variable
options+=("$@")
printf '%s\n' "${options[@]}"
}
答案2
一种选择是显式使用该函数的子 shell,然后覆盖其数组的本地副本,因为知道一旦子 shell 退出,原始变量就不会更改:
# a subshell in () instead of the common {}, in order to munge a local copy of "options"
some_func () (
local urn=$1
shift
options+=("$@")
printf '%s\n' "${options[@]}"
)