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阅读这个(以及更多)的细节. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |