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