내 스크립트에서 배열에 대한 일부 작업을 재사용할 수 있음을 발견했습니다. 그래서 재사용 가능한 코드를 함수나 스크립트로 리팩터링하려고 생각 중이에요.
하지만 함수나 스크립트에 대한 위치 인수로 배열을 제공할 수 있도록 함수나 스크립트를 어떻게 작성합니까? 아니면 비슷한 목표를 달성하시겠습니까?
감사해요.
답변1
최근(>=4.3) 버전에서는 이름 참조를 사용합니다 bash
.
foo () {
local param1=$1
local -n arr=$2
printf 'array: %s\n' "${arr[@]}"
}
myarray=( some items go here )
foo something myarray
배열 변수의 이름은 두 번째 매개변수로 함수에 전달됩니다. 이 함수는 이름을 받는 이름 참조 변수를 선언합니다. 해당 이름의 참조 변수에 대한 모든 액세스는 이름이 함수에 전달된 변수에 액세스합니다.
이것은 분명히 여러 배열에서 작동합니다.
위의 예에서는 이름이 지정된 변수를 arr
함수에 전달할 수 없으므로 주의해야 합니다.이름 충돌을 피하기 위해( ksh93
이름 참조도 지원되지만 범위가 다르기 때문에 이 문제는 발생하지 않습니다.)
이 접근 방식은아니요다른 쉘 스크립트를 호출할 때 작동합니다. 다른 셸 스크립트를 호출할 때 배열은 다른 스크립트의 명령줄에서 전달되어야 합니다. 이는 배열이 문자열 집합으로 전달되어야 함을 의미합니다. 이 방법으로 단일 배열을 전달하는 것은 상대적으로 쉽습니다.Hauke Laging은 그의 답변에서 이를 수행하는 방법의 기본을 보여줍니다..
배열의 내용을 완전히 제어할 수 있는 경우 해당 요소를 구분 기호로 구분하여 해당 데이터를 단일 문자열로 인코딩한 다음 대상 스크립트에서 이러한 문자열을 구문 분석하여 배열을 재구성할 수 있습니다. 또 다른 가능성은 스크립트 사이에 JSON "인터페이스"를 사용하는 것입니다. 즉, 데이터를 JSON으로 인코딩하고 이를 스크립트의 표준 입력(또는 유사)에 전달한 다음 jq
. 간접비.
답변2
my_func param1 param2 param2 after_this_the_array_values "${myarr[@]}"
my_func () {
shift 4
local array=("$@")
}