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[@]}"
}

전달된 매개변수는 2개의 배열이 아니고 1 2 3 4 5 one two three four five.

이 함수는 list_arrays전달된 매개변수가 아니라 정의된 local array_one합계를 인쇄합니다.local 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=$1이며 local _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[@]}"

}

이제 array_one첫 번째 매개변수 1array_two두 번째 매개변수 와 동일하므로 2출력은 다음과 같습니다.

1
2

관련 정보