2014-09-16 10 views
0

[email protected]을 다른 함수의 다른 변수에 저장 한 후 어떻게 반복 할 수 있습니까?

참고 이것은 bash가 아니라 sh 쉘입니다.

내 코드 (슈퍼 간체) :

#! /bin/sh 

set -- a b "c d" 

args= 

argv() { 
    shift # pretend handling options 
    args="[email protected]" # remaining arguments 
} 

fun() { 
    for arg in "$args"; do 
    echo "+$arg+" 
    done 
} 

argv "[email protected]" 
fun 

출력 : 내가 원하는

+b c d+ 

:

+b+ 
+c d+ 

특별한 변수 [email protected] 저장 보존 ARGV 공백. for 루프는 공백을 보존하는 [email protected]을 반복 할 수 있습니다.

set -- a b "c d" 
for arg in "[email protected]"; do 
    echo "+$arg+" 
done 

출력 :

+a+ 
+b+ 
+c d+ 

그러나 [email protected]

다른 변수에 사라 보존 공백을 할당됩니다.

set -- a b "c d" 
args="[email protected]" 
for arg in "$args"; do 
    echo "+$arg+" 
done 

출력

+a b c d+ 

없이 따옴표 :

for arg in $args; do 
    echo "+$arg+" 
done 

출력 :이 배열을 사용하여 수행 할 수 있습니다 떠들썩한 파티에서

+a+ 
+b+ 
+c+ 
+d+ 

.

set -- a b "c d" 
args=("[email protected]") 
for arg in "${args[@]}"; do 
    echo "+$arg+" 
done 

출력 :

+a+ 
+b+ 
+c d+ 

해당이 쉬 쉘에서 수행 할 수 있습니까?

+0

이 $ '처럼 배열 파라미터 또는 확장을 지원하지 않는 POSIX 쉘의 제한은 {@ 2}'. –

답변

1

shiftargv에서 수행 한 경우 shiftfun 안에 다시 사용할 수 있습니다.

#! /bin/sh 

set -- a b "c d" 

args= 

argv() { 
    shifted=1 # pretend handling options 
    shift $shifted 
} 

fun() { 
    [ -n $shifted ] && shift $shifted 
    for arg; do 
    echo "+$arg+" 
    done 
} 

argv "[email protected]" 
fun "[email protected]" 

출력 :

+b+ 
+c d+ 
+0

이 가장 우수합니다. 유일한 경고 또는 부작용은 그 안에 모호한 숫자가있는 느린 전역 변수입니다. – lesmana

0

두 가지 해결 방법이 있습니다. 둘 다주의해야한다.

첫 번째 해결 방법 : 인수 사이에 줄 바꿈을 넣은 다음 read을 사용하십시오.

set -- a b " c d " 

args= 

argv() { 
    shift 
    for arg in "[email protected]"; do 
    args="$args$arg\n" 
    done 
} 

fun() { 
    printf "$args" | while IFS= read -r arg; do 
    echo "+$arg+" 
    done 
} 

argv "[email protected]" 
fun 

출력 : 전후에도 보존 공백

+b+ 
+ c d + 

참고.

경고 : 인수에 개행 문자가 포함되어 있으면 조였다.

두 번째 해결 방법 : 인수 주위에 따옴표를 넣은 다음 eval을 사용하십시오.

set -- a b " c d " 

args= 

argv() { 
    shift 
    for arg in "[email protected]"; do 
    args="$args \"$arg\"" 
    done 
} 

fun() { 
    for arg in "[email protected]"; do 
    echo "+$arg+" 
    done 
} 

argv "[email protected]" 
eval fun "$args" 

경고 : 인수에 따옴표가 포함되어 있으면주의해야합니다.