我的bash技能几乎为零。我想出了一个脚本来监控 wifi 接口的数据传输速度。
#!/bin/bash
rx_old=0
tx_old=0
speed() {
read rx_bytes < /sys/class/net/wlp9s0f0/statistics/rx_bytes
read tx_bytes < /sys/class/net/wlp9s0f0/statistics/tx_bytes
drx=$(((rx_bytes - rx_old) / 1024))
dtx=$(((tx_bytes - tx_old) / 1024))
rx_old=$rx_bytes
tx_old=$tx_bytes
echo "$drx KB/s $dtx KB/s"
}
while true;
do
echo $(speed)
sleep 1
done
这不起作用,我的意思是变量 rx_old 和 tx_old 似乎没有更新。我认为我无法从函数内部更改这些变量。有人可以给我一些对此的见解吗?
答案1
问题是echo $(speed)
。里面的命令$(...)
在子 shell 中执行,换句话说,在执行脚本的 shell 的子进程中执行。子 shell 无法更改其父 shell 中的变量。
结果,主 shell 中的rx_old
和tx_old
确实没有更新。具有相同名称的变量会在子 shell 中更新,但当子 shell 退出时它们会消失。
不需要$(...)
,因为它所做的只是回显该函数已经回显的文本speed
。它可以被替换为“naked” speed
,它在主 shell 中运行并因此更新这些变量。