2012-07-25 35 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

因爲什麼|之後會是一個子shell。在子shell中更改的變量不會傳播回父shell。

常見解決方法:

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

就個人而言,我更喜歡以避免while read可能的情況下。我會做這樣的:

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

declare -p svnTags的結果則:

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")'