同学问了这样一个问题:
#! /bin/bash
declare -a lines
i=0
cat /proc/net/netstat | while read line
do
lines[$i]=${line}
i=$((i+1))
done
echo ${lines[0]}
最终了输出结果${lines[0]}是空
试了一下果然如此
经过一番尝试,发现是使用了管道的问题,改为
#! /bin/bash
declare -a lines
i=0
while read line
do
lines[$i]=${line}
i=$((i+1))
done < /proc/net/netstat
echo ${lines[0]}
就没问题了
同样,如果管道前的cat换成ls、echo等,也会有相同问题
似乎是使用了管道后,变量的作用域发生了改变
关于这点在《高级bash脚本编程指南》上找到了相关提示:
将echo的输出通过管道传 递给read命 令可能会产生不可预料的结果. 在这种情况下, read命令的行为就好像它在子shell中运行一样. 可以使用set命 令来代替(就好像例子 11-17一样).
不过也没解释为什么,feature or bug?