여기서 기본적인 문제는 배열을 설계 / 구현 한 배쉬 개발자가 실제로 문제를 해결했다는 것입니다. 그들은을 ${array}
위한 짧은 손 이라고 결정했습니다 ${array[0]}
. 이것은 나쁜 실수입니다. 특히 당신이 그것을 고려할 때${array[0]}
배열 유형이 연관되어 있으면 의미가 없으며 빈 문자열로 평가됩니다.
배열 을 할당하면 value에 array=(value1 ... valueN)
구문 이있는 형식이 사용되므로 배열 [subscript]=string
의 특정 인덱스에 직접 값을 할당 할 수 있습니다. 이를 통해 숫자 인덱스와 해시 인덱스 (bash 괄호에서 연관 배열이라고 함)의 두 가지 유형의 배열이 가능합니다. 또한 희소하게 숫자 인덱스 된 배열을 만들 수 있습니다. 오프 떠나는 [subscript]=
부분은 0의 서수 인덱스에서 시작하여 할당 문에서 각각 새 값으로 증가하는 숫자 인덱스 배열 짧은 손입니다.
따라서 전체 배열, 인덱스 및 모두로 ${array}
평가해야 합니다. 대입 문의 역으로 평가해야합니다. 3 학년 CS 전공은이를 알아야합니다. 이 경우이 코드는 예상 한대로 작동합니다.
declare -A foo bar
foo=${bar}
그런 다음 값으로 배열을 함수에 전달하고 하나의 배열을 다른 배열에 지정하면 나머지 쉘 구문이 지시하는대로 작동합니다. 그러나이 작업을 제대로 수행하지 않았기 때문에 할당 연산자 =
는 배열에서 작동하지 않으며 값을 통해 함수 또는 하위 셸 또는 일반적으로 ( echo ${array}
) 출력으로 배열을 전달할 수 없습니다 .
따라서 올바르게 수행 된 경우 다음 예제는 bash에서 배열의 유용성이 실질적으로 더 나은 방법을 보여줍니다.
simple=(first=one second=2 third=3)
echo ${simple}
결과 출력은 다음과 같아야합니다.
(first=one second=2 third=3)
그런 다음 배열은 대입 연산자를 사용하고 값을 통해 함수 및 다른 셸 스크립트에 전달할 수 있습니다. 파일로 출력하여 쉽게 저장하고 파일에서 스크립트로 쉽게로드 할 수 있습니다.
declare -A foo
read foo <file
아아, 우리는 다른 최상급 배쉬 개발 팀에 의해 실망했습니다.
따라서 배열을 함수에 전달하려면 실제로 하나의 옵션 만 있으며 nameref 기능을 사용하는 것입니다.
function funky() {
local -n ARR
ARR=$1
echo "indexes: ${!ARR[@]}"
echo "values: ${ARR[@]}"
}
declare -A HASH
HASH=([foo]=bar [zoom]=fast)
funky HASH # notice that I'm just passing the word 'HASH' to the function
결과는 다음과 같습니다.
indexes: foo zoom
values: bar fast
이것은 참조로 전달되므로 함수의 배열에 할당 할 수도 있습니다. 예, 참조되는 배열은 전역 범위를 가져야하지만 이것이 쉘 스크립팅이라는 점을 고려할 때 너무 큰해서는 안됩니다. 연관 또는 희소 색인 배열을 값으로 함수에 전달하려면 모든 색인과 값을 인수 목록 (큰 배열 인 경우 너무 유용하지 않음)에 다음과 같은 단일 문자열로 던져야합니다.
funky "${!array[*]}" "${array[*]}"
그런 다음 함수 내부에 많은 코드를 작성하여 배열을 다시 어셈블합니다.