击:不能在管的右侧构建阵列(Bash: can't build array in right

2019-06-26 12:43发布

任何人都有一个线索,为什么预期这个代码不工作?

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

Answer 1:

因为之后发生了什么| 是一个子shell。 在子shell变量改变不传播回父shell。

常见的解决方法:

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


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


文章来源: Bash: can't build array in right side of pipe