如何将数组作为参数传递给Bash中的函数

时间:2013-05-09 12:20:22

标签: arrays bash shell

众所周知,在bash编程中,传递参数的方式是$1,...,$N。但是,我发现将数组作为参数传递给接收多个参数的函数并不容易。这是一个例子:

f(){
 x=($1)
 y=$2

 for i in "${x[@]}"
 do
  echo $i
 done
 ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "${a[@]}" $b
f "${a[*]}" $b

如上所述,函数f接收两个参数:第一个分配给x,这是一个数组,第二个分配给y

f可以通过两种方式调用。第一种方法使用"${a[@]}"作为第一个参数,结果是:

jfaldsj 
jflajds

第二种方式使用"${a[*]}"作为第一个参数,结果是:

jfaldsj 
jflajds 
LAST

两种结果都不如我所愿。那么,有没有人知道如何正确地在函数之间传递数组?

5 个答案:

答案 0 :(得分:66)

您无法传递数组,只能传递其元素(即扩展数组)。

#! /bin/bash
function f() {
    a=("$@")
    ((last_idx=${#a[@]} - 1))
    b=${a[last_idx]}
    unset a[last_idx]

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f "${x[@]}" "$b"
echo ===============
f "${x[*]}" "$b"

另一种可能性是按名称传递数组:

#! /bin/bash
function f() {
    name=$1[@]
    b=$2
    a=("${!name}")

    for i in "${a[@]}" ; do
        echo "$i"
    done
    echo "b: $b"
}

x=("one two" "LAST")
b='even more'

f x "$b"

答案 1 :(得分:28)

您可以通过引用bash 4.3+中的函数传递数组。这可能来自ksh,但语法不同。关键思想是设置-n属性:

show_value () # array index
{
    local -n array=$1
    local idx=$2
    echo "${array[$idx]}"
}

这适用于索引数组:

$ shadock=(ga bu zo meu)
$ show_value shadock 2
zo

它也适用于关联数组:

$ days=([monday]=eggs [tuesday]=bread [sunday]=jam)
$ show_value days sunday
jam

另请参见手册页中的declare -n

答案 2 :(得分:6)

您可以先传递“标量”值。这会简化事情:

f(){
  b=$1
  shift
  a=("$@")

  for i in "${a[@]}"
  do
    echo $i
  done
  ....
}

a=("jfaldsj jflajds" "LAST")
b=NOEFLDJF

f "$b" "${a[@]}"

此时,您可以直接使用array-ish位置参数

f(){
  b=$1
  shift

  for i in "$@"   # or simply "for i; do"
  do
    echo $i
  done
  ....
}

f "$b" "${a[@]}"

答案 3 :(得分:0)

这将解决将数组传递给函数的问题:

#!/bin/bash

foo() {
    string=$1
    array=($@)
    echo "array is ${array[@]}"
    echo "array is ${array[1]}"
    return
}
array=( one two three )
foo ${array[@]}
colors=( red green blue )
foo ${colors[@]}

答案 4 :(得分:0)

将数组作为函数传递

array() {
    echo "apple pear"
}

printArray() {
    local argArray="${1}"
    local array=($($argArray)) # where the magic happens. careful of the surrounding brackets.
    for arrElement in "${array[@]}"; do
        echo "${arrElement}"
    done

}

printArray array