如何将数组文字传递给 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
出于安全原因,您需要确定传递给函数的数组的内容。
首先,我阅读了有关传递数组的一般信息——我看到的所有示例都首先为数组创建了临时变量,然后传递了它。摘自
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
出于安全原因,您需要确定传递给函数的数组的内容。