创建时传递数组

时间:2015-02-04 12:12:15

标签: arrays shell

我有一种情况需要将数组传递给shell脚本中的函数。但是我需要在创建时正确传递这个数组,我正在努力解决它的语法问题。

我需要像 -

这样的东西
#! /bin/bash

array_test(){
local_array1=("${!1}")
echo "${local_array1[1]}"
}

array_test sample_array1=("abc" "def")

评论后编辑 -

我希望sample_array1功能

中可以访问“abc”的内容,即“def”和“array_test()

1 个答案:

答案 0 :(得分:1)

您不能使用除字符串之外的任何内容作为shell函数的参数。但是,如果您的shell支持pass a reference to a variable containing an array,那么可以 variable indirection。例如,在Bash中:

$ copy_func() {
    name="${1}[@]"
    copy=("${!name}")
    echo "Array length: ${#copy[@]}"
    echo "First element: ${copy[0]}"
    echo "Second element: ${copy[1]}"
}
$ foo=('a a a' 'b b b')
$ copy_func 'foo'
Array length: 2
First element: a a a
Second element: b b b

但是,此时你已经超出了Bash的理智应用范围,应该认真考虑使用真正的语言。

你也可以传递整个变量声明和eval它,但那是 too dangerous for production code

$ eval_func() {
    eval "$1"
    echo "Array length: ${#foo[@]}"
    echo "First element: ${foo[0]}"
    echo "Second element: ${foo[1]}"
}
$ var='foo=("a a a" "b b b")'
$ eval_func "$var"
Array length: 2
First element: a a a
Second element: b b b

Bash范围非常宽松,因此您可以在外部范围内声明它,然后在函数中访问它。如果您不能使用其他语言,我强烈推荐这种方法:

$ access_func() {
        echo "Array length: ${#foo[@]}"
        echo "First element: ${foo[0]}"
        echo "Second element: ${foo[1]}"
}
$ foo=('a a a' 'b b b')
$ access_func
Array length: 2
First element: a a a
Second element: b b b