Shell脚本数组语法

时间:2013-08-01 18:55:23

标签: arrays shell

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

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

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

(在my_function中)

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

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

1 个答案:

答案 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*