我将一个数组作为参数提供给这样的函数:
declare -a my_array=(1 2 3 4)
my_function (????my_array)
我希望数组作为一个数组传递给函数,而不是作为4个单独的参数传递。然后在函数中,我想迭代遍历数组:
(在my_function中)
for item in (???)
do
....
done
(???)的正确语法是什么。
答案 0 :(得分:1)
bash没有数组文字的语法。您显示的内容(my_function (1 2 3 4)
)是语法错误。你必须使用
my_function "(1 2 3 4)"
my_function 1 2 3 4
第一个:
my_function() {
local -a ary=$1
# do something with the array
for idx in "${!ary[@]}"; do echo "ary[$idx]=${ary[$idx]}"; done
}
对于第二个,只需使用"$@"
或:
my_function() {
local -a ary=("$@")
# do something with the array
for idx in "${!ary[@]}"; do echo "ary[$idx]=${ary[$idx]}"; done
}
不情愿的编辑......
my_function() {
local -a ary=($1) # $1 must not be quoted
# ...
}
declare -a my_array=(1 2 3 4)
my_function "${my_array[#]}" # this *must* be quoted
这取决于您的数据不包含空格。例如,这不会起作用
my_array=("first arg" "second arg")
你想要传递2个元素,但你会收到4.将数组强制转换为字符串然后重新扩展它充满了危险。
您可以使用间接变量执行此操作,但它们对于数组来说很难看
my_function() {
local tmp="${1}[@]" # just a string here
local -a ary=("${!tmp}") # indirectly expanded into a variable
# ...
}
my_function my_array # pass the array *name*