与本地内置命令一起使用时,Bash数组大小不反映实际大小

时间:2018-04-10 13:38:07

标签: bash sed

我的日志文件ala.txt看起来像这样:

dummy FromEndPoint = PW | dummy | ToEndPoint = LALA | dummy
dummy FromEndPoint = PW | dummy | ToEndPoint = PAPA | dummy
dummy FromEndPoint = WF | dummy | ToEndPoint = LALA | dummy
dummy FromEndPoint = WF | dummy | ToEndPoint = KAKA | dummy

我使用sed生成一个包含FromEndPoint和ToEndPoint的每个组合的数组。然后我想迭代它。

function main {
    file="./ala.txt"
    local a=`sed 's/^.*FromEndPoint = \([a-zA-Z\-]*\).*ToEndPoint = \([a-zA-Z\-]*\).*$/\1;\2/' $file | sort -u`

    echo ${#a[@]} # prints 1

    for connectivity in ${a[@]}; do
        echo "conn: $connectivity" # iterates 4 times
        #conn: PW;LALA
        #conn: PW;PAPA
        #conn: WF;KAKA
        #conn: WF;LALA
    done

}

如果数组中有4个元素,为什么echo ${#a[@]}会打印1?我怎样才能得到它的实际尺寸?

使用Bash:4.4.12(1)-release

1 个答案:

答案 0 :(得分:2)

不要使用变量来存储多行内容,请使用数组!

bash shell中,您可以处理替换功能,使命令输出显示为文件内容,供您使用数组进行解析。在bash及以上4版本中,命令readarray and mapfile可以解析给定分隔符的多行输出,而无需使用带有read的for循环

#!/usr/bin/env bash

array=()
while read -r unique; do
    array+=( "$unique" )
done< <(sed 's/^.*FromEndPoint = \([a-zA-Z\-]*\).*ToEndPoint = \([a-zA-Z\-]*\).*$/\1;\2/' file | sort -u)

现在以echo "${#array[@]}"打印数组的长度应按预期打印长度。

始终将local变量的初始化分开并为其分配值。见Why does local sweep the return code of a command?