我将数组作为参数提供给这样的函数:
declare -a my_array=(1 2 3 4)
my_function (????my_array)
我希望将数组作为一个数组传递给函数,而不是作为 4 个单独的参数。然后在函数中,我想遍历数组,如:
(在我的函数中)
for item in (???)
do
....
done
(???) 的正确语法应该是什么。
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*