Bash 将数组作为一个参数传递给函数,并在其后传递其他参数

Bash 将数组作为一个参数传递给函数,并在其后传递其他参数,bash,Bash,我想把一个数组传递给一个函数,循环通过它 is_node ${nodes[@]} 如果我尝试循环 function is_node(){ for role in "${1[@]}" do 我得到以下错误: 不良替代 如果我首先检查参数的数量,我会注意到不止一个参数 function is_node(){ if [[ $# -ne 1 ]] then echo "Error - The number of arguments

我想把一个数组传递给一个函数,循环通过它

is_node ${nodes[@]} 
如果我尝试循环

function is_node(){
    for role in "${1[@]}"
               do
我得到以下错误:

不良替代

如果我首先检查参数的数量,我会注意到不止一个参数

function is_node(){
   if [[ $# -ne 1 ]] then   
        echo "Error - The number of arguments is not correct. 1 argument(a role name) needed" 
我想传递数组,就像传递一个参数一样,然后传递其他参数

is_node array status limit

然后在函数内部循环通过它。

我假设您希望编写同时具有参数的函数-数组和传统的“单”参数。如果我错了,请告诉我

is_node ${nodes[@]} 
我的解决方案:

#!/bin/bash

function_with_array_and_single_argument () {
    declare -a _array1=("${!1}")
    echo "${_array1[@]}"
    echo $2 
}

array="a
b
c"

function_with_array_and_single_argument "array[@]" "Szczerba"
输出:

$ ./script.sh
a
b
c
Szczerba

您可以以任何方式传入参数列表。函数的参数只是“$@”

还要注意引号的正确使用,以及省略(这里是免费的)Bash only关键字
函数

更切题地说,如果您没有传递令牌的显式列表,shell将在“$@”中假定
,因此这可以(稍微模糊地)简化为角色的
;执行


如果您有固定数量的其他参数,只需将它们放在变长参数列表之前。

这个问题完全有效,不要认为它是重复的

将数组作为参数传递给函数作为
“${nodes[@]}”
${nodes[@]}
的问题在本例中是在接收端,数组内容不会保持完整,因为数组的内容在调用函数之前已展开。因此,当参数在接收器处解包时,它们将在
$1
$2
处拆分,直到数组大小。从这个简单的例子可以看出

set -x
newf() { echo "$1"; echo "$2"; echo "$3"; }
arr=(1 2 3)
newf "${arr[@]}"
+ newf 1 2 3
+ echo 1
1
+ echo 2
2
+ echo 3
3
如您所见,数组
arr
被扩展到位置参数列表,而其目的是使用数组

因此,考虑到这个问题,并且您声称在数组之后有额外的参数标志,您需要在接收方识别如何开始处理数组之后的参数。最好的方法是使用
*
传递数组扩展,以便将引用的元素作为一个整体

因此,假设您的函数需要3个参数,您可以如下定义它。接收器上的
read
命令将整个数组内容字符串拆分为单个元素,并将其存储在数组
arrayArgs
中,您可以根据需要对其进行解析

is_node(){
    (( $# < 3 )) && { printf 'insufficient args provided' >&2; return 1; }
    read -ra arrayArgs <<<"$1"
    printf 'Printing the array content \n'
    for element in "${arrayArgs[@]}"; do
        printf '%s\n' "$element"
    done
    printf '2nd arg=%s 3rd arg=%s\n' "$2" "$3"       
}

@tripleee:不要认为它是重复的,这个问题涉及在数组之后传递额外的参数。它可能不涉及与复制的相同内容如果
导出IFS='b'
?如果数组元素中有空格怎么办?;)在本例中,
array
变量是字符串,而不是数组,因此传递
array[@]
->
array
更简单。如果您的
\u array1
被声明为只有一个元素的数组,
${\u array1[@]}
等于1,请尝试
printf“%s\n”${u array1[@]}
list=(1 2 3)
is_node "${list[*]}" 4 5