매우 큰 배열이 있다는 점을 고려하면 $large_list
배열을 매개변수로 사용하는 함수를 작성하는 방법이 있습니까? 예를 들어:
echo_idx_array () {
arr="$1"
idx="$2"
echo "${arr[$idx]}"
}
이와 같은 작업을 수행하는 일반적인 전략은 무엇입니까? 변수를 제공하려고 시도했지만 $large_list
비어 있습니다.
매개변수 목록의 변경 사항에 맞게 함수를 수정하겠습니다.
참고로 저는 ksh88을 사용하고 있으며 최대한 이식 가능한 답변을 찾고 있습니다.
편집하다:지금까지 제가 생각할 수 있는 가장 좋은 방법은 배열을 반복하고 각 요소를 매개변수로 함수에 보내는 것입니다. 이는 매우 보기 흉하고 오류가 발생하기 쉬우며, 특정 한도에 매우 빠르게 도달할 수밖에 없다는 점은 말할 것도 없습니다. 이것이 내가 한 일입니다:
foo () {
echo $*
}
cmd="foo "
while [[ $i -lt $MAX_ARR_SIZE ]]; do
cmd="$cmd ${large_list[$i]}"
((i=i+1))
done
eval $cmd
더 좋은 일 없을까요?
답변1
배열 요소를 함수에 인수로 전달하려면 ksh 구문을 사용하여 배열 요소를 목록으로 확장합니다.
work_on_array "${myarray[@]}"
접미사는 [@]
배열 확장을 만듭니다. 큰따옴표는 각 요소가 추가 확장(분할 및 와일드카드)되지 않도록 보호합니다. 확장의 결과는 일반적으로 큰따옴표에서처럼 한 단어가 아니라 배열의 요소 수만큼 단어입니다.
이것질소그런 다음 배열의 첫 번째 요소는 다음과 같습니다. 액세스하려면 다음을 참조하세요.${N}
eval
다른 변수 "내부"에서 변수 참조 사용
답변2
bash 4.3+에는 아마도 ksh의 방법이 있습니다.
echo_idx_array () # array index
{
local -n array=$1 # add nameref attribute
local idx=$2
echo "${array[idx]}"
}
$ names=(one two three four)
$ echo_idx_array names 2
three
$ days=([monday]=eggs [tuesday]=bread [sunday]=jam) # associative array
$ echo_idx_array days sunday
jam
당신은 또한 볼 수 있습니다 declare -n
.
답변3
Korn Shell에 따라 다름... 최신 AT&T ksh93 및 mksh 버전은 이 기능을 지원합니다.
function echo_idx_array {
nameref arr=$1
idx=$2
echo "${arr[idx]}"
}
set -A test -- a b c
echo_idx_array test 1
현재 쉘에서는 "b"가 출력됩니다.