如何解决从bash中的subshell循环修改全局变量
我的目标是测量当前系统负载的百分比,然后使LED闪烁一秒。为此,我有一个函数“ get_load”,它在while循环中测量一秒钟内的平均负载,并以get_load &
之类的子shell运行它。 get_load函数还在每次迭代后定义一个全局LASTLOAD变量。之后,我有一个flip_led函数,它可以打开LED指示灯,休眠1-LASTLOAD秒,将其关闭,然后休眠1-LASTLOAD秒(应合计为一)
问题在于,全局LASTLOAD变量似乎从未更新过,或者至少没有传播到flip_led循环中。
我的问题是如何在子Shell中运行循环,但该子Shell是否会影响初始脚本中的全局变量?
在此脚本本身
readonly LEDTRIGGER="/sys/class/leds/led0/trigger"
readonly LEDBRIGHTnesS="/sys/class/leds/led0/brightness"
LASTLOAD=0
ISRUNNING=1
function get_load() {
# Define all local variables used in function
local user1 sys1 idle1 user2 sys2 idle2 u s i load
while [[ $ISRUNNING -eq 1 ]]; do
# Get initial usage
read -r user1 sys1 idle1 \
<<<"$(grep 'cpu ' /proc/stat | awk '{print $2" "$4" "$5}')"
sleep 1
# Get usage after a second has passed
read -r user2 sys2 idle2 \
<<<"$(grep 'cpu ' /proc/stat | awk '{print $2" "$4" "$5}')"
u=$(echo "scale=4;$user2-$user1" | bc)
s=$(echo "scale=4;$sys2-$sys1" | bc)
i=$(echo "scale=4;$idle2-$idle1" | bc)
# Return the average usage over the last second rounded
load=$(echo "scale=4;($u+$s)*100/($u+$s+$i)" | $BC)
# loadint=$(echo "($load+0.5)/1" | $BC)
percent=$(echo "scale=4;$load/100" | $BC)
# echo "load: $load,loadint: $loadint,percentage: $percent"
# return "$loadint"
# echo "$percent"
LASTLOAD=$percent
echo "$LASTLOAD"
done
}
function flip_led() {
while [[ $ISRUNNING -eq 1 ]]; do
local remainder
remainder=$(echo "scale=2;1-$LASTLOAD" | $BC)
echo 1 | sudo tee $LEDBRIGHTnesS >/dev/null
echo "led on for $LASTLOAD,off for $remainder"
$SLEEP "$LASTLOAD"
echo 0 | sudo tee $LEDBRIGHTnesS >/dev/null
$SLEEP "$remainder"
done
}
echo none | sudo tee $LEDTRIGGER >/dev/null
echo 0 | sudo tee $LEDBRIGHTnesS >/dev/null
get_load &
flip_led &
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。