Amol1984
作者Amol19842019-09-11 11:11
系统工程师, YuSYS

关于一个SHELL while循环内变量改变不传递至循环外现象的解释

字数 1291阅读 1705评论 0赞 3

1.现象:写了个while循环获取信息,并计划将信息拼接至变量 v_ETH_SPEED 中,结果while循环内是拼接了,循环外变量 v_ETH_SPEED 还是空的
代码段如下:

v_BOND_MODE=
v_ETH_SPEED=

#initial the v_ETH_SPEED varible
ifconfig -a|grep eth|awk {'print $1'}|while read a
do
  echo "===eth detected:${a},v_ETH_SPEED=${v_ETH_SPEED}"
  v_ETH_SPEED=$(echo "${v_ETH_SPEED} ${a} $(ethtool $a|grep Speed|awk {'print $2'})")
done
echo "====eth detected:${a},v_ETH_SPEED=${v_ETH_SPEED}"

运行输出结果如下:
SUSE-RAC1:/scripts # sh cal_netrate20190911.sh
===eth detected:eth1,v_ETH_SPEED=
===eth detected:eth3,v_ETH_SPEED= eth1 1000Mb/s
====eth detected:,v_ETH_SPEED=

2.分析:
使用了管道的缘故
当启用管道时,会生成一个subshell,while循环的代码在subshell中执行,那么变量map也是在subshell中被修改,
while循环结束后,回到主shell, v_ETH_SPEED 没有被修改,也就是说,两个 v_ETH_SPEED 不是同一个 v_ETH_SPEED ,while中修改的 v_ETH_SPEED 是外层 v_ETH_SPEED 的副本。

3.处理:
改“管道”模式为“重定向”模式后,运行结果正常:

ifconfig -a|grep eth|awk {'print $1'}>/tmp/${0}.tmp
while read a
do
  echo "===eth detected:${a},v_ETH_SPEED=${v_ETH_SPEED}"
  v_ETH_SPEED=$(echo "${v_ETH_SPEED} ${a} $(ethtool $a|grep Speed|awk {'print $2'})")
done < /tmp/${0}.tmp
echo "====eth detected:${a},v_ETH_SPEED=${v_ETH_SPEED}"

results:
SUSE-RAC1:/scripts # sh cal_netrate20190911.sh
===eth detected:eth1,v_ETH_SPEED=
===eth detected:eth3,v_ETH_SPEED= eth1 1000Mb/s
====eth detected:,v_ETH_SPEED= eth1 1000Mb/s eth3 1000Mb/s

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

3

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关问题

相关资料

X社区推广