배열을 함수에 전달하지만 함수의 하나의 매개변수만 전체 배열을 받도록 하는 것이 가능합니까?

배열을 함수에 전달하지만 함수의 하나의 매개변수만 전체 배열을 받도록 하는 것이 가능합니까?

배열을 함수에 전달하는 경우:

func()
{
    echo $1
    echo $2
    echo $3
}

myArray=("This" "Is" "An Array")
func "${myArray[@]}"

그러면 배열의 각 요소가 함수의 별도 매개변수로 전달됩니다.

함수의 한 매개변수가 전체 배열만 수신하도록 하는 방법이 있습니까?

답변1

어느 정도는 가능합니다. Bash 및 ksh93에는 포인터와 유사한 이름 참조가 있어 배열을 전달할 수 있습니다.이름해당 기능으로 이동하여 거기에서 사용하십시오.

#!/bin/bash    
function byname {
        typeset -n _p=$1
        echo "second item of '$1' is ${_p[1]}"
        echo "second arg to this function is \"$2\""
}
blah=(a b c)
byname blah "other arg"

하지만 Bash에서는 nameref의 이름( _p여기서)은 그것이 가리키는 변수의 이름과 달라야 하므로 재귀 함수에는 덜 유용합니다. ksh에서는 ksh 스타일 함수에서 동일한 이름( function foo대신 )만 사용합니다.foo()

라벨에 나와 있듯이 이것은인용하다, 복사본이 아니기 때문에 함수에서 배열을 수정하면 변경 사항이 기본 프로그램에 표시됩니다.

또 다른 더 나쁜 옵션은 배열을 문자열에 연결하여 변수로 전달하는 것입니다.

function concated {
        echo "the whole array is \"$1\""
}
concated "${blah[*]}"

그러나 이는 배열에서 문자열로의 패키징을 위한 복잡한 시스템을 마련하지 않는 한 기본적으로 배열을 사용하는 목적을 무산시킵니다.

위 호출은 물론 다음과 같이 인쇄됩니다.

second item of 'blah' is b
second arg to this function is "other arg"
the whole array is "a b c"

관련 정보