![배열을 매개변수로 전달하는 방법은 무엇입니까?](https://linux55.com/image/181072/%EB%B0%B0%EC%97%B4%EC%9D%84%20%EB%A7%A4%EA%B0%9C%EB%B3%80%EC%88%98%EB%A1%9C%20%EC%A0%84%EB%8B%AC%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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:q
in (t)csh
및 "${array[@]}"
out이 필요하며 yash
에서는 null 삭제(다시 또는 주변 ) 의 영향을 zsh
받습니다 .$array
"${array[@]}"
"$array[@]"
"${(@)array}"