从bash中的subshel​​l循环修改全局变量

如何解决从bash中的subshel​​l循环修改全局变量

我的目标是测量当前系统负载的百分比,然后使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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?