함수 범위 내에서만 배열에 추가

함수 범위 내에서만 배열에 추가

, 등이 될 수 GET있는 REST API 호출을 수행하는 함수를 작성 중입니다 .PUTDELETEPOST

이 메서드를 함수에 대한 매개 변수로 제공하고 해당 단일 함수 호출에 대한 옵션 배열에 추가하고 싶습니다. 가능합니까?

현재 저는 별도의 배열을 생성하여 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 이상에서는 동작이 Ash 기반 쉘처럼 동작하도록 localvar_inherit하는 옵션을 사용하여 값이나 속성을 변경하지 않고 변수를 로컬로 만들 수 있습니다.locallocal 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

한 가지 옵션은 함수의 하위 쉘을 명시적으로 사용한 다음 해당 배열의 로컬 복사본을 덮어쓰는 것입니다. 이때 하위 쉘이 종료되면 원래 변수는 변경되지 않습니다.

# 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[@]}"
)

관련 정보