2013-12-16 3 views
3

매개 변수가 배열 인 경우 어떻게 매개 변수를 확장 할 수 있습니까?Bash에서 배열 인자의 간접 매개 변수 확장

매개 변수가 간단한 변수 인 경우 느낌표를 사용하여 간접 참조를 수행 할 수 있습니다.

single_fruit() 
{ 
    if [ "$#" != 1 ]; then exit 1; fi 
    echo ${!1} 
} 

MYVAR=Persimmon 
single_fruit MYVAR 

동일한 매개 변수를 배열에 사용하고 싶습니다. 직접 배열의 요소를 반복하는 대신 :

FRUIT=(Papaya Pineapple) 
for f in ${FRUIT[@]} 
do 
    echo ${f} 
done 

내가 함수 내에서 반복 싶습니다

multi_fruit() 
{ 
    if [ "$#" != 1 ]; then exit 1; fi 
    PARAMETER=${1} 
    for i in ${!PARAMETER[@]} 
    do 
     echo ${i} 
    done 
} 

MOREFRUITS=(Mango Melon) 
multi_fruit MOREFRUITS 

당신은 배열 요소를이 마지막 기능으로 반복 할 수 있습니까?

+0

세 가지 유용하고 독특한 솔루션은 아래와 같다. 나는 가장 단순한 함수 호출을 필요로하고 다른 두 가지를 선정했다. – Calaf

답변

2

당신은 그것을 할 수 있지만 예상치 못한 방법 :

: 자리 표시 자 var에 배열 인덱스를 포함해야
multi_fruit() { 
    (($# != 1)) && return 1 
    tmp="${1}[@]" 
    for i in "${!tmp}"; do 
     echo "$i" 
    done 
} 

또한 대문자 변수 만 사용하는 것은 좋지 않습니다. 이름. 어느 날 실수로 PATH를 덮어 쓰고 스크립트가 왜 고장 났는지 궁금 할 것입니다. 대문자 바를 시스템에 그대로 두십시오.

변수 주위에 중괄호를 두는 것이 큰 따옴표와 같지 않음에 유의하십시오. 예를 들어, 고려 :이 작동

var="one two three" 
printf "%s\n" ${var} 
printf "%s\n" "$var" 
+0

"$ {1} [@]"을 쓰면 단순히 문자 [@]를 추가한다는 의미입니다. 그런 다음 배열 이름에서 확장이 수행되고 리터럴 [@]은 계속됩니다. 무슨 일 이니? – Calaf

+0

네, 맞습니다. 불행히도 bash 개발자는'$ {! ...'- 배열에 적용될 때 배열 * 인덱스를 제공합니다. * :'declare -A x = ([foo] = bar [baz] = qux); echo $ {! x [@]}''foo baz'를 출력합니다. (어떤 순서로) - "스칼라"변수를 사용하여 간접적으로 수행합니다 : 그러므로'$ {! tmp} ' –

2

BASH의 배열을 전달하는 것은 간단하지 않습니다. 사실 배열은 하위 셸로도 내보낼 수 없습니다. 배열 변수를 함수에 전달하려면 "ARRAY [@]"구문을 사용하고 변수 간접 연산자를 사용하여 함수 내부에서 배열을 재구성해야합니다.

이 스크립트를 고려 :

multi_fruit() { 
    if [ "$#" != 1 ]; then exit 1; fi 
    # array reconstructions 
    arr=("${!1}") 
    for i in ${arr[@]} 
    do 
     echo ${i} 
    done 
} 

MOREFRUITS=(Mango Melon) 
multi_fruit "MOREFRUITS[@]" 

출력 :

Mango 
Melon 
2

:

multi_fruit() 
{ 
    if [ $# -lt 1 ]; then exit 1; fi 
    for i in "[email protected]" 
    do 
     echo ${i} 
    done 
} 

MOREFRUITS=(Mango Melon) 
multi_fruit "${MOREFRUITS[@]}" 
+0

흥미 롭습니다. bash 맨 페이지가 $ @ 특수 매개 변수에 대해 말하는 것을 구문 분석하려고합니다. – Calaf

+0

따옴표로 묶지 않으면'$ @'는'$ * '와 동일합니다. 그것은 항상 당신이'$ @'를 사용하도록 유도하는 특별한 따옴표 붙은 행동이기 때문에 따옴표''$ @ "'를 항상 사용해야합니다. 인용하지 않을 때는'$ *'를 사용하여 의도적으로 인용하지 않고 인용 부호를 붙이십시오. – chepner