2012-07-25 3 views
2

이 코드가 예상대로 작동하지 않는 이유에 대한 단서가 누구에게 있습니까?Bash : 파이프의 오른쪽에 배열을 만들 수 없습니다.

$> svnTags=() 
$> svn ls http://plugins.svn.wordpress.org/duplicate-post/tags/ | while read line; do slashless=$(sed 's#/$##g' <<< $line); echo "slashless - $slashless"; svnTags+=($slashless); done 
slashless - 1.0 
slashless - 1.1 
slashless - 1.1.1 
slashless - 1.1.2 
slashless - 2.0 
slashless - 2.0.1 
slashless - 2.0.2 
slashless - 2.1 
slashless - 2.1.1 
slashless - 2.2 
slashless - 2.3 
$> echo "$svnTags[@]" 

출력이 나오지 않으면 svn 태그의 기본 배열을 출력 할 것으로 예상됩니다.

두 번째 명령은 세분화 : 무엇 | 후 발생하는 서브 쉘입니다

svn ls http://plugins.svn.wordpress.org/duplicate-post/tags/ | while read line; do 
    slashless=$(sed 's#/$##g' <<< $line) 
    echo "slashless - $slashless" 
    svnTags+=($slashless) 
done 

답변

5

때문입니다. 서브 쉘에서 변경된 변수는 상위 쉘로 다시 전파되지 않습니다.

일반적인 해결 방법 :

while read line ; do 
    ... 
done < <(svn ls http://...) 
-2

는 개인적으로, 나는 가능하면 while read을 피하기 위해 선호합니다. 나는 이런 식으로 할 거라고 : declare -p svnTags

url=http://plugins.svn.wordpress.org/duplicate-post/tags/ 
IFS=$'\n' svnTags=($(svn ls "$url" | sed 's/^/slashless - /; s#/$##g')) 

결과는 다음과 같습니다

declare -a svnTags='([0]="slashless - 0.3" [1]="slashless - 0.4" [2]="slashless - 0.5" [3]="slashless - 0.6" [4]="slashless - 0.6.1" [5]="slashless - 1.0" [6]="slashless - 1.1" [7]="slashless - 1.1.1" [8]="slashless - 1.1.2" [9]="slashless - 2.0" [10]="slashless - 2.0.1" [11]="slashless - 2.0.2" [12]="slashless - 2.1" [13]="slashless - 2.1.1" [14]="slashless - 2.2" [15]="slashless - 2.3" [16]="slashless - 2.4" [17]="slashless - 2.4.1")' 
관련 문제