2017-01-19 6 views
3

변수를 인용하는 방법을 알 수없는 Bash 스크립트가 있습니다. 모든 도움을 주시면 감사하겠습니다. 배열을 Bash 함수에 전달하는 방법은 무엇입니까?

이 코드

완벽하게 작동합니다 :

myfunction() { 
    for i in "${BASE_ARRAY[@]}" 
    do 

나는 내가 다른 배열을 다시 사용할 수있는 함수에 변수로 내 배열의 이름을 전달하고자합니다. 배쉬에서

myfunction() { 
    local x="$1[@]" 
    for i in "${!x}" 
    do 

간접 참조 "${!VARIABLE_CONTAINING_NAME_TO_EXPAND} 같이 :

myfunction BASE_ARRAY 
+0

복제본처럼 보입니다 : http://stackoverflow.com/questions/1063347/passing-arrays-as-parameters-in-bash – codeforester

답변

4

이 시도 : 나는 함수에 다음과 같은 패스

다음
myfunction() { 
    for i in "${$1[@]}" 
    do 

: 이것은 내가이 실패 노력하고 코드입니다 "배열이 아닌 변수의 경우는 간단합니다.

그러나 y 배열 (또는 귀하의 경우에는 모든 항목)의 항목에 액세스해야하므로 확장 할 변수에 전체 참조를 넣어야합니다.

+0

'$ 1 [@]'로 확장되는 것은 무엇입니까? 그건 나에게 의미가 없다. 위치 매개 변수는'$ @'이고,'$ 1'에 의해 명명 된 배열의 배열 요소를보고 싶다면, 당신이 그것을 '평가'해야 할 것 같습니다. – Graham

+0

$ 1 (첫 번째 위치 인수)에 ARRAY_NAME이 (가) 있다고 가정합니다. 그러면 $ 1 [@]이 (가) ARRAY_NAME [@] (으)로 확장됩니다. 배열 요소의 실제 검색을 실행하는 것은 $ {! x} 단계입니다. – Fred

+1

'local x = "$ {1} [@]"'로 작성하는 것이 더 명확 할 수도 있습니다 (원래 코드는 완전히 동일하지만). –

6

배열을 성공으로 통과 한 적이 한번도 없었습니다.

나를 위해, 두 가지 옵션은 항상 내용을 함수로 전달하거나 (bash 4.3 이후로) 참조를 사용하여 액세스 할 배열 이름을 전달합니다. 다음 예제를 고려하십시오.

#!/usr/bin/env bash 

myfunc() { 
     local -n arr=$1 
     printf '%s\n' "${arr[1]}" 
     arr[1]=HELLO 
} 

a=(one two three) 

myfunc a 
printf '%s\n' "${a[1]}" 

생산되는 :

$ ./sample 
two 
HELLO 

local -n 그 원본 콘텐츠 오히려 로컬 포인터는 배열의 로컬 사본을 제공하지 않는다는 점에서 같은 declare -n이지만, . 이 예에서 $arr[]을 변경하면 실제로 원래 배열 $a[]이 변경됩니다.

배열 내용을 함수에 전달하는 전통적인 방법은 StackOverflow에서 여러 번 언급되어 왔지만 거의 언급되지 않았습니다. 예제를 찾는 데 어려움이 없을 것입니다.

+0

이것은 굉장합니다. 나는 몰랐다. 제 두뇌를 다시 확장 해 주셔서 감사합니다. – Graham

+1

이것은 매우 좋으며, 감히 말하자면, 적어도 쉘 구문만큼이나 흥미 진진합니다. 그러나 그것은 또한 매우 새롭다. 나는 완전히 패치 된 CenOS 7 시스템을 가지고 있으며, bash는 여전히 4.2.26 버전이다. 무작위 시스템에 광범위하게 배포 된 스크립트에서 사용하려면 좋은 시간을 기다려야 할까 봐 걱정됩니다. – Fred

+0

이것은 프레드의 대답과 정말로 비슷합니다. 로컬 변수에 -n을 추가하면 어떤 이점이 있습니까? 더 빠릅니까? 내가 올바르게 이해한다면 -n을 사용하면 함수 내에서 실제 배열을 변경할 수 있습니까? – tjohnson