Bash
僅在函式範圍內添加到數組
我正在編寫一個函式,它將進行 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[@]}" }