5

任何人都知道为什么这段代码没有按预期工作?

$> 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
4

2 回答 2

9

因为之后发生|的是一个子shell。在子 shell 中更改的变量不会传播回父 shell。

常见的解决方法:

while read line ; do
    ...
done < <(svn ls http://...)
于 2012-07-25T18:15:41.973 回答
-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")'
于 2012-07-25T18:26:29.940 回答