先说结论:bash函数不支持传递数组参数,只能传值;所以要传数组只能把数组展开,作为多个参数传,然后在函数内重新封装成数组。
举例:
#!/bin/bash
function foo() {
typeset -a arr=("$@")
for e in "${arr[@]}"; do
echo "element: $e"
done
}
array=(aa bb cc)
foo "${array[@]}"
运行结果:
element: aa
element: bb
element: cc
这里要注意的是对引号的使用不可少,否则如果数组元素中包含空格,则不能按照选用解析,例如:
#!/bin/bash
function foo() {
echo "len1=${#@}"
typeset arr=("$@") # quotes
echo "len2=${#arr[@]}"
for e in "${arr[@]}"; do # quotes
echo "element: $e"
done
}
array=(aa "b b" cc)
foo ${array[@]} # quotes
运行结果:
len1=4
len2=4
element: aa
element: b
element: b
element: cc
原数组中第二个元素"b b"被解析成了两个元素("b"和"b")。
第二个例子关于引号的:
#!/bin/bash
function foo() {
echo "len1=${#@}"
typeset arr=($@) # quotes
echo "len2=${#arr[@]}"
for e in "${arr[@]}"; do # quotes
echo "element: $e"
done
}
array=(aa "b b" cc)
foo "${array[@]}" # quotes
运行结果:
len1=3
len2=4
element: aa
element: b
element: b
element: cc
还有第三个引号相关例子:
#!/bin/bash
function foo() {
echo "len1=${#@}"
typeset arr=("$@") # quotes
echo "len2=${#arr[@]}"
for e in ${arr[@]}; do # quotes
echo "element: $e"
done
}
array=(aa "b b" cc)
foo "${array[@]}" # quotes
运行结果:
len1=3
len2=3
element: aa
element: b
element: b
element: cc
都是引号引发的数组解析错误。
网友评论