【问题标题】:Bash: can't build array in right side of pipeBash:无法在管道右侧构建数组
【发布时间】:2012-07-24 06:07:54
【问题描述】:

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

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

【问题讨论】:

    标签: arrays bash shell


    【解决方案1】:

    因为| 之后发生的事情是一个子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")'
      

      【讨论】:

        猜你喜欢
        • 2021-02-27
        • 2019-03-03
        • 2022-01-08
        • 1970-01-01
        • 2018-06-15
        • 2021-09-13
        • 1970-01-01
        • 1970-01-01
        • 2021-03-27
        相关资源
        最近更新 更多