众所周知,在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
两种结果都不如我所愿。那么,有没有人知道如何正确地在函数之间传递数组?
答案 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