Bash 行为:使用下划线和匹配变量名来强制数组?

Bash 行为:使用下划线和匹配变量名来强制数组?

在下面的代码片段中,我发现,当尝试将多个数组传递给 Bash 中的函数时,我可以使用第一个示例中的语法来执行此操作,但前提是:

  1. 数组变量名称以下划线 (_) 为前缀
  2. 数组变量名称在接收函数中的名称与调用函数的名称相同
function list_arrays {
    local _array_one=$1
    local _array_two=$2
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

输出:

1
2
3
4
5
one
two
three
four
five

稍微改变示例以删除下划线......

#!/bin/bash

function list_arrays {
    local array_one=$1
    local array_two=$2
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

输出:

1
2

最后一次迭代以更改 list_arrays 函数中数组变量的名称

#!/bin/bash

function list_arrays {
    local _array_first=$1
    local _array_second=$2
    for ip in "${_array_first[@]}"; do
        echo "$ip"
    done
    for node in "${_array_second[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

main

输出:


(无输出)

该行为非常方便,但在生产脚本中使用它之前我想了解我在做什么。起初我以为这可能与引用传递。然而,这种语法在 Bash 4.1 中有效,这似乎是在添加引用传递之前。

答案1

该代码按预期工作:

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    list_arrays "${array_one[@]}" "${array_two[@]}"
}

传递的参数不是两个数组,而是1 2 3 4 5 one two three four five.

该函数list_arrays打印的不是传递的参数,而是定义的local array_onelocal array_two 在主函数中

您可以通过将代码更改为来看到这一点

function list_arrays {
    # no variable definition
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )
    # no arguments passed
    list_arrays
}

输出:

1
2
3
4
5
one
two
three
four
five

变量local _array_one=$1local _array_two=$2根本没有在您的代码中真正使用。


当您重新定义变量时,如

function list_arrays {
    local array_one=$1 # overwrites main's array_one
    local array_two=$2 # overwrites main's array_two
    for ip in "${array_one[@]}"; do
        echo "$ip"
    done
    for node in "${array_two[@]}"; do
        echo "$node"
    done
}

function main {
    local array_one=( 1 2 3 4 5 )
    local array_two=( one two three four five )

    # arguments passed are 1 2 3 4 5 one two three four five
    list_arrays "${array_one[@]}" "${array_two[@]}"

}

nowarray_one等于第一个参数1array_two第二个参数 ,2因此输出为

1
2

相关内容