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

时间:2018-09-24 11:03:27

标签: 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 not correct. 1 argument(a role name) needed" 

我想像一个参数一样传递数组,并在之后传递其他参数

is_node array status limit

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

3 个答案:

答案 0 :(得分:1)

该问题完全正确,不要认为它与Passing arrays as parameters in bash.重复

在这种情况下,将数组作为参数传递给函数为"${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"       
}

并将数组作为

传递
list=(1 2 3)
is_node "${list[*]}" 4 5

答案 1 :(得分:0)

我假设您想同时使用两个参数编写函数-数组和传统的“单个”参数。如果我弄错了,请告诉我。

我的解决方案:

#!/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

答案 2 :(得分:0)

您可以按自己喜欢的任何方式传递参数列表。该函数的参数只是"$@"

is_node(){
    for role in "$@"; do
        : something with "$role"
    done
}

is_node "${nodes[@]}"

还请注意正确使用引号,并省略(仅在此处提供的)免费的Bash关键字function

更切地讲,如果您未传递令牌的显式列表,则外壳将假设in "$@",因此可以(稍微模糊)将其简化为for role; do

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