bash如何将数组作为parameter passing给函数

我们知道,在bash编程中,传递参数的方法是$1 ,…, $N 不过,我发现把一个数组作为parameter passing给一个接收多个参数的函数并不容易。 这里是一个例子:

 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 

这两个结果都不如我所愿。 那么,有没有人有任何想法如何正确地传递函数之间的数组。

你不能传递一个数组,你只能传递它的元素(即扩展数组)。

 #! /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' fx "$b" 

您可以通过引用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

你可以先传递“标量”的值。 这将简化事情:

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

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

 #!/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[@]}