, 등이 될 수 GET
있는 REST API 호출을 수행하는 함수를 작성 중입니다 .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 이상에서는 동작이 Ash 기반 쉘처럼 동작하도록 localvar_inherit
하는 옵션을 사용하여 값이나 속성을 변경하지 않고 변수를 로컬로 만들 수 있습니다.local
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
한 가지 옵션은 함수의 하위 쉘을 명시적으로 사용한 다음 해당 배열의 로컬 복사본을 덮어쓰는 것입니다. 이때 하위 쉘이 종료되면 원래 변수는 변경되지 않습니다.
# 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[@]}"
)