仅在函数范围内添加到数组

仅在函数范围内添加到数组

我正在编写一个函数,它将进行 REST API 调用,可以是GETPUTDELETEPOST等。

我想将此方法作为参数提供给函数,并将其添加到该单个函数调用的选项数组中。这可能吗?

目前我正在通过创建一个单独的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[@]}"
)

相关内容