Bash

僅在函式範圍內添加到數組

  • February 8, 2019

我正在編寫一個函式,它將進行 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,添加新選項,然後在函式結束之前將其重置,但我認為這也不是一個特別乾淨的方法。

一種選擇是顯式使用函式的子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[@]}"
)

使用 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[@]}"
}

引用自:https://unix.stackexchange.com/questions/499553