BASH/DASH:将数组传递给函数的最佳方法是什么?

BASH/DASH:将数组传递给函数的最佳方法是什么?

我有这个数组:

PARAMETERS_OF_COMPONENTS[1]="component1"
PARAMETERS_OF_COMPONENTS[2]="component21 component22 component23"
PARAMETERS_OF_COMPONENTS[3]="component3"
PARAMETERS_OF_COMPONENTS[4]="component41 component42 component43"

我想将该数组传递给这个函数:

foo()
{
    local param1="$1"
    local param2="$2"
    local array_param="$3"
    . . .

    echo "${PARAMETERS_OF_COMPONENTS[@]}"
}

当我以这种方式传递数组时:

foo "$param1" "$param2" "${PARAMETER_OF_COMPONENTS[@]}"

然后函数只打印:

component1

另外,我已经尝试了其他几种方法来传递数组,但我仍然没有找到正确的解决方案。

如何正确地将数组传递给函数?此外,解决方案必须与 Dash 兼容(至少没有 bashisms)。

UPD @Kusalananda 向我解释说 Dash 不支持数组。谢谢你的澄清。

我再问一个。如何将许多参数传递给函数而不直接以方式传递$1$2...并且不涉及全局变量?我有几个想法,但我想听听你的方法?

我的任务是将函数从一个文件移动到另一个文件,但该函数使用全局变量。我不想使用全局变量。那么如何以最正确的方式做到这一点呢?

答案1

sh在不支持数组和关键字的 shell中local,您仍然可以$@在函数中使用数组。您可以选择前两个参数,shift 2然后使用$@它现在保存所有其余的参数。

foo () {
    arg1=$1
    arg2=$2

    shift 2  # shift $3 into $1, $4 into $2 etc.

    for n in "$@"; do    # or just: for n do
        printf 'Other argument: %s\n' "$n"
        # other code acting on "$n"
    done
}

foo "arg1" "arg2" "arg3" "arg4"

如果函数不需要修改全局变量并且您不想用不必要的变量污染变量命名空间,请将函数体括起来,( ... )而不是使所有变量都为本地变量。{ ... }


使用您的原始数据并按foo上述方式声明:

set -- "component1" \
       "component21 component22 component23" \
       "component3" \
       "component41 component42 component43"

foo "$param1" "$param2" "$@"

在支持数组 和 的 shell 中local,您将执行完全相同的操作(但该函数可能想要使用声明为 的变量local),并且调用可能是

foo "arg1" "arg2" "${myarray[@]}"

要在 中传递多个数组bash,我将在函数中使用名称引用(需要bash4.3 或更高版本):

foo () {
   local arg1=$1
   local arg2=$2
   local -n arr1=$3
   local -n arr2=$4

   for n in "${arr2[@]}"; do ...; done
}

foo "arg1" "arg2" myarray1 myarray2

请注意,您不能将数组变量传递给与函数中相应名称引用变量同名的函数(我认为这是一个错误,它适用于ksh93)。

相关内容