将数组直接传递给Shell中的函数

时间:2015-10-04 16:00:31

标签: arrays shell

是否可以将数组直接传递给shell / bash中的函数,而不首先将其保存到变量?

目前的例子:

function checkParameter(){
    param1=("${!1}")
    for a in "${param1[@]}"; do
        echo "${a}"
    done

    param2=("${!2}")
    for b in "${param2[@]}"; do
        echo "${b}"
    done
}

a=( "child 1 from 1" "child 2 from 1" "child 3 from 1" )
b=( "child 1 from 2" "child 2 from 2")
checkParameter a[@] b[@]

我可以将( "child 1 from 1" "child 2 from 1" "child 3 from 1" )( "child 1 from 2" "child 2 from 2")直接传递给函数checkParameter,而不是先将其保存在ab吗?

问候和感谢,
christopher2007

3 个答案:

答案 0 :(得分:1)

" $ 1和#34;是不可改变的。这就是为什么您的示例必须将其值存储在临时变量中的原因。这适用于$@,无论它们是否作为数组传递。

答案 1 :(得分:0)

您确定需要使用数组吗?

checkparameters() {
    for param in "$@"; do
        echo "$param"
    done
}

checkparameters "a" "b" "c"

要回答这个问题,我不认为可以将数组作为函数的args传递而不进行转换。

修改

您可以尝试以下方式:

[ ~]$ cat test.sh 
#!/bin/bash 

declare -a a1
a1=("a" "b")

declare -a a2
a2=("c" "d")

checkParameters(){
    for i in "$@"; do
        echo "Content of $i :"
        for j in $(eval "echo \${$(echo $i)[@]}"); do
            echo $j
        done
    done
}

checkParameters "a1" "a2"
[ ~]$ ./test.sh 
Content of a1 :
a
b
Content of a2 :
c
d

答案 2 :(得分:0)

通常,无法将数组传递给Bash脚本或函数作为数组

当您在命令行上传递数组时,例如"${ary[@]}",您不会传递数组,而是将元素传递为< em>个人参数;第一个数组元素绑定到特殊参数$1,第二个绑定到$2,...

您的解决方案尝试将数组变量名称传递给函数,其中变量间接({{1} })用于访问函数内的数组。 [1]

根据定义,这种方法要求数组预先存储在变量中。

至于你希望在不将数组存储在变量中的情况下执行此操作:您无法在Bash中将数组文字作为参数传递;概念等同于简单地传递个别参数

问题在于您无法分辨出一个数组的元素结束和下一个数组的开始

您可以通过引入 separator 参数来解决这个问题,该参数的唯一目的是指示数组何时结束。

例如,如果您知道您的元素永远不会包含换行符,可以使用${!...}作为分隔符:

$\n

[1]只是为了展示解决方案的简化版本,使变量 - 间接部分更加清晰:

#!/usr/bin/env bash

function checkParameter(){
  local -i arrayNdx=1
  for param; do # Loop over all parameters
    [[ $param == $'\n' ]] && { (( ++arrayNdx )); continue; }
    echo "From array $arrayNdx: [$param]"
  done  
}

# Pass the array elements as individual parameters
# and use $'\n' (a newline) to separate the elements of the 1st
# array from those of the 2nd.
checkParameter "a1-child 1" "a1-child 2" "a1-child 3" $'\n' "a2-child 1" "a2-child 2"