任何人都有一个线索,为什么预期这个代码不工作?
$> 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
因为之后发生了什么|
是一个子shell。 在子shell变量改变不传播回父shell。
常见的解决方法:
while read line ; do
...
done < <(svn ls http://...)
就个人而言,我更喜欢以避免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")'