首页 > 解决方案 > 在while循环中更改变量

问题描述

我正在尝试制作一个为我的窗口管理器输出状态栏的脚本。它输出正常的东西,如时间、日期、天气等。

它输出的字符串之一是系统(Arch Linux)的更新次数。由于我从中提取更新数的“API”每天有最大请求数,因此我必须向 updates() 函数(输出更新数)添加延迟,以便最大请求数不是超过。

添加此延迟会使问题开始。

不知何故,updates_aur 变量没有存储在内存中,并且在我实现的延迟被删除之前无法访问。(下面的代码中有更多解释)

我希望实施延迟,以使每次迭代都不会检查更新,而是每 60 次检查一次。

我尝试将“updates_aur”和“updates_arch”导出到环境变量,以便将它们存储在内存中,但由于脚本创建了一个子shell,它们无法访问它们以进行更新/检索。

updates() {

    if [ "$internet" = true ]; then

    if ! updates_arch=$(checkupdates 2> /dev/null | wc -l ); then
        updates_arch=0
    fi

    if (( $counter % 60 == 0 )); then #this is done to add a delay and not saturate aur requests
        if ! updates_aur=$(yay -Qum --devel 2> /dev/null | wc -l); then
        updates_aur=0
      fi
    else
      :
    fi

    updates=$(("$updates_arch" + "$updates_aur"))

    if [ "$updates" -gt 0 ]; then
        echo " Updates: $updates"
    else
      echo " Updates: 0"
    fi

    echo $delim

    else
        :
  fi
}

然后在 while 循环中调用它(while 循环也将计数器增加 1)

完整代码:https ://github.com/Baitinq/dwm/blob/master/scripts/dwm-status

我希望 aur_updates 的变量在计数器 %60 == 0 时更新和存储,但实际结果是该变量只能在计数器 %60 == 0 时访问,就好像它没有存储在内存并更新,但在计数器 % 60 == 0 的每个 while 循环迭代中创建。

标签: linuxbashshell

解决方案


由于您在子shell中运行函数,例如(来自status函数):

echo $(updates)

updates_aur当 subshel​​l 退出时,它们的变量 ( ) 值会丢失。没有理由在echo其中包含一个函数echo。只需直接调用您的函数:

updates

这发生在具有其他功能的几个地方。那里也没有必要。


推荐阅读