배열을 매개변수로 전달하는 방법은 무엇입니까?

배열을 매개변수로 전달하는 방법은 무엇입니까?

array특히 함수가 중간에 있는 경우 어떻게 함수에 전달합니까 ? 둘 "${b}""${b[@]}"첫 번째 항목만 전달하는 것 같으니 동시에 호출하고 검색할 수 있는 방법이 있습니까?

#/usr/bin/env bash

touch a b1 b2 b3 c

f()
{
    local a="${1}"
    local b="${2}"   
    local c="${3}"
    ls "${b[@]}" # expected b1 b2 b3
}

a=a
b=("b1" "b2" "b3")
c=c

f "${a}" "${b}" "${c}"
f "${a}" "${b[@]}" "${c}"

rm a b1 b2 b3 c

답변1

셸 에서 배열의 모든 개별 요소(배열 인덱스에 따라 정렬)로의 확장은 배열 디자인이 bash복사되는 ksh셸에서와 동일 합니다 .bash"${array[@]}""$array""${array[0]}"

따라서 배열의 모든 요소를 ​​함수에 전달하는 것은 입니다 f "${array[@]}".

이제 함수의 매개변수는 를 통해 액세스되므로 "$@"함수는 다음과 같아야 합니다.

f() {
  ls -ld -- "$@"
}

f "$a" "${b[@]}" "$c"

또 다른 옵션은 이름으로 배열을 전달하고 명명된 참조를 사용하는 것입니다( (ksh93) bash에서 ksh복사한 다른 기능 ):

f() {
  typeset -n array="$1"
  ls -ld -- "${array[@]}"
}

f b

또는 f파일 이름, 배열 이름, 다른 파일 이름 등 3개의 매개변수를 사용합니다.

f() {
  typeset -n array="$2"
  ls -ld -- "$1" "${array[@]}" "$3"
}

f "$a" b "$c" 

csh배열( , tcsh, rc, es, zsh, yash) 이 있는 거의 모든 다른 셸에서는 fish간단히 사용하여 $array배열의 모든 요소로 확장할 수 있습니다. 다른 모든 셸에서 배열은 일반(비희소) 배열이기도 합니다. 그러나 몇 가지 주의 사항이 있습니다. csh/tcsh 및 yash에서는 $array여전히 분할+glob의 영향을 받고 이를 해결하려면 $array:qin (t)csh"${array[@]}"out이 필요하며 yash에서는 null 삭제(다시 또는 주변 ) 의 영향을 zsh받습니다 .$array"${array[@]}""$array[@]""${(@)array}"

관련 정보