0

我将数组作为参数提供给这样的函数:

 declare -a my_array=(1 2 3 4)  
 my_function  (????my_array)

我希望将数组作为一个数组传递给函数,而不是作为 4 个单独的参数。然后在函数中,我想遍历数组,如:

(在我的函数中)

for item in (???) 
do 
.... 
done

(???) 的正确语法应该是什么。

4

1 回答 1

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*
于 2013-08-01T19:25:39.170 回答