加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

arrays – 数组在bash脚本中消失

发布时间:2020-12-15 22:00:58 所属栏目:安全 来源:网络整理
导读:我正在编写一个脚本来收集各种网络统计信息. 我要做的是从netstat -i命令生成一些delta数据. 我正在使用以下bash代码收集所需的数据: declare -a arrayn=0netstat -i | tail -n +3 | while read LINE; do echo "Setting array[$n] to $LINE" array[$n]=$LIN
我正在编写一个脚本来收集各种网络统计信息.
我要做的是从netstat -i命令生成一些delta数据.

我正在使用以下bash代码收集所需的数据:

declare -a array
n=0
netstat -i | tail -n +3 | while read LINE; do
        echo "Setting array[$n] to $LINE"
        array[$n]=$LINE
        echo "array now have ${#array[@]} entries"
        let n=$n+1
done
echo "array now have ${#array[@]} entries"

此命令的输出是:

Setting array[0] to eth0       1500 0   4946794      0      0 0       2522971      0      0      0 BMRU
array now have 1 entries
Setting array[1] to lo        16436 0     25059      0      0 0         25059      0      0      0 LRU
array now have 2 entries
Setting array[2] to vmnet1     1500 0         6      0      0 0          1126      0      0      0 BMRU
array now have 3 entries
Setting array[3] to vmnet8     1500 0       955      0      0 0          1054      0      0      0 BMRU
array now have 4 entries
Setting array[4] to wlan0      1500 0    613879      0      0 0        351194      0      0      0 BMU
array now have 5 entries
array now have 0 entries

如你所见,数组实际上在while循环后消失了,我不明白为什么.

解决方法

每次使用管道时,都会创建一个隐式子shell.当子shell终止时,它的变量也会终止.对此的快速解决方法是不要管道阅读.您可以使用进程替换来完成上述操作:

while read LINE; do
        echo "Setting array[$n] to $LINE"
        array[$n]=$LINE
        echo "array now have ${#array[@]} entries"
        let n=$n+1
done < <(netstat -i | tail -n +3)

更符合POSIX的方法(阅读:更具可移植性,更少基础)是让所有事情都发生在子shell中:

netstat -i | tail -n +3 | {
    declare -a array
    n=0
    while read LINE; do
        echo "Setting array[$n] to $LINE"
        array[$n]=$LINE
        echo "array now have ${#array[@]} entries"
        let n=$n+1
    done
    echo "array now have ${#array[@]} entries"
}

你可以在Greg Wooledge’s wiki阅读这个(以及更多)的细节.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读