如何将数组文字传递给 bash 函数

How to pass array literal to a bash function

首先,我阅读了有关传递数组的一般信息——我看到的所有示例都首先为数组创建了临时变量,然后传递了它。摘自

show_value () # array index
{
    local -n myarray=
    local idx=
    echo "${myarray[$idx]}"
}

shadock=(ga bu zo meu)
show_value shadock 2

有没有办法直接将数组作为文字传递,即不创建临时变量?

我尝试过简单地用数据替换名称的简单方法,但我在“(”上出现语法错误。

更新:

我使用 openSUSE Leap 15.3 和 bash 4.4。上面的代码当然有效,但我想将调用更改为:

show_value (ga bu zo meu) 2

即直接传递数组数据(不使用额外变量)。

函数参数的结构不足以处理数组等嵌套数据结构。参数是一个简单的字符串列表,仅此而已。

您可以内联扩展数组:

show_value "${shadock[@]}" 2

但是分隔符丢失了。无法知道数组的开始和结束位置,因为它扩展为:

show_value ga bu zo meu 2

您必须自己找出数组边界。选项包括:

  • 如果命令只有一个数组参数,将它放在最后一个。许多采用多个文件名的传统 UNIX 工具就是这样做的。示例:ls <file>...chmod <mode> <file>....

  • 如果有固定数量的参数,你可以把数组放在中间preceding/following这样你就可以明确地确定数组的位置。示例:cp <file>... <dir>.

  • 如果有多个数组,可以要求用户用--分隔。许多 git 的更复杂的子命令都是这样做的。

我警告不要将数组 name 作为参数。这是一种非常 shell 的技术。以后很难将该函数转换为成熟的脚本或二进制文件。

如果你想改变参数的顺序:

show_value () #  index array_element [...]
{
    local idx=
    local -a myarray=("${@:2}")
    echo "${myarray[$idx]}"
}

然后

shadock=(ga bu zo meu)
show_value 2 "${shadock[@]}"   # => zo

如果要将索引保留为最后一个参数,则

show_value () #  array_element [...] index
{
    local -a myarray=("${@:1:$#-1}")
    local idx=${!#}
    echo "${myarray[$idx]}"
}
show_value "${shadock[@]}" 2   # => zo

local -n myarray= 肯定 比这一切更整洁,不是吗?它还会更快,内存效率更高——您不必复制所有数据。

你能考虑一下这个语法吗:

show_value () # array index
{
    local -a myarray=
    local idx=
    echo "${myarray[$idx]}"
}

show_value "(ga bu zo meu)" 2

出于安全原因,您需要确定传递给函数的数组的内容。