BASH/DASH: 배열을 함수에 전달하는 가장 좋은 방법은 무엇입니까?

BASH/DASH: 배열을 함수에 전달하는 가장 좋은 방법은 무엇입니까?

나는 이 배열을 가지고 있습니다 :

PARAMETERS_OF_COMPONENTS[1]="component1"
PARAMETERS_OF_COMPONENTS[2]="component21 component22 component23"
PARAMETERS_OF_COMPONENTS[3]="component3"
PARAMETERS_OF_COMPONENTS[4]="component41 component42 component43"

해당 배열을 이 함수에 전달하고 싶습니다.

foo()
{
    local param1="$1"
    local param2="$2"
    local array_param="$3"
    . . .

    echo "${PARAMETERS_OF_COMPONENTS[@]}"
}

이 방법으로 배열을 전달할 때:

foo "$param1" "$param2" "${PARAMETER_OF_COMPONENTS[@]}"

그런 다음 함수는 다음을 인쇄합니다.

component1

또한 배열을 전달하기 위해 여러 가지 다른 방법을 시도했지만 여전히 올바른 솔루션을 찾지 못했습니다.

배열을 함수에 올바르게 전달하는 방법은 무엇입니까? 또한 솔루션은 Dash와 호환되어야 합니다(적어도 bashism은 제외).

UPD @Kusalananda는 Dash가 배열을 지원하지 않는다고 설명했습니다. 명확하게 해 주셔서 감사합니다.

한 가지 더 질문하겠습니다. $1양식 에 직접 전달하지 $2않고 전역 변수를 사용하지 않고 함수에 많은 인수를 전달할 수 있는 방법은 무엇입니까 ? 몇 가지 아이디어가 있지만 귀하의 접근 방식을 듣고 싶습니다.

내 임무는 함수를 한 파일에서 다른 파일로 이동하는 것인데, 함수가 전역 변수를 사용합니다. 전역 변수를 사용하고 싶지 않습니다. 그렇다면 가장 올바른 방법으로 이를 수행하는 방법은 무엇입니까?

답변1

sh배열과 키워드를 지원하지 않는 셸에서는 함수에서 배열을 local계속 사용할 수 있습니다 $@. 처음 두 매개변수를 선택한 shift 2다음 이를 사용하여 $@나머지 매개변수를 모두 저장할 수 있습니다.

foo () {
    arg1=$1
    arg2=$2

    shift 2  # shift $3 into $1, $4 into $2 etc.

    for n in "$@"; do    # or just: for n do
        printf 'Other argument: %s\n' "$n"
        # other code acting on "$n"
    done
}

foo "arg1" "arg2" "arg3" "arg4"

함수가 전역 변수를 수정할 필요가 없고 변수 네임스페이스를 불필요한 변수로 오염시키지 않으려면 ( ... )모든 변수를 로컬 변수로 만드는 대신 함수 본문을 래핑하세요.{ ... }


원본 데이터를 사용하고 foo위와 같이 선언합니다.

set -- "component1" \
       "component21 component22 component23" \
       "component3" \
       "component41 component42 component43"

foo "$param1" "$param2" "$@"

배열과 을 지원하는 셸에서는 local정확히 동일한 작업을 수행하지만(그러나 함수는 로 선언된 변수를 사용하려고 할 수 있음 local) 호출은 다음과 같을 수 있습니다.

foo "arg1" "arg2" "${myarray[@]}"

에서 여러 배열을 전달하려면 bash함수에서 이름 참조를 사용합니다( bash4.3 이상 필요).

foo () {
   local arg1=$1
   local arg2=$2
   local -n arr1=$3
   local -n arr2=$4

   for n in "${arr2[@]}"; do ...; done
}

foo "arg1" "arg2" myarray1 myarray2

함수의 해당 이름 참조 변수와 동일한 이름을 가진 함수에 배열 변수를 전달할 수 없다는 점에 유의하세요(이것은 버그라고 생각합니다. 작동합니다 ksh93).

관련 정보