【问题标题】:Bash while loop with if statement stuck in true loop带有 if 语句的 Bash while 循环卡在真正的循环中
【发布时间】:2020-07-24 13:20:55
【问题描述】:

我正在编写电池通知脚本。

抱歉,目前这是零碎的调试代码。

这是我到目前为止的代码......

#!/bin/bash

BatteryCapacity=`cat /sys/class/power_supply/BAT0/capacity`
BatteryStatus=`cat /sys/class/power_supply/BAT0/status`
BatteryFull="Full"
BatteryDischarging="Discharging"
BatteryCharging="Charging"
CriticalAlert=97
NormalAlert=96
LowAlert=95
i=0

while true 
do
    if [ "$BatteryStatus" = "$BatteryDischarging" ]; then
        if [ $BatteryCapacity -le $CriticalAlert ]; then
            notify-send -u critical "Alert" "Battery Low!!!"
            echo "Success01"
            sleep 10

    else 
        if [ "A" = "A" ]; then 
            echo "Success02"
            sleep 10

            fi  
        fi  
    fi
done

当$BatteryStatus = Discharging (Discharging = Discharging) 且$BatteryCapacity = $CriticalAlert(我在调试此程序时更改此值以匹配实际电池容量)程序将成功满足第一组条件并回显“Success01” .

+ '[' Discharging = Discharging ']'
+ '[' 97 -le 97 ']'
+ notify-send -u critical Alert 'Battery Low!!!'
+ echo 'Success 001'
Success 001
+ sleep 10

但是如果我的 $BatteryStatus 不等于 Discharging 并且是 Charging 或 Full 程序将卡在...

+ '[' Charging = Discharging ']'
+ true
+ '[' Charging = Discharging ']'
+ true
+ '[' Charging = Discharging ']'
+ true
+ '[' Charging = Discharging ']'
+ true
...

我很困惑为什么程序会卡在+ '[' Charging = Discharging ']' + true 循环中,而不是转到 else 条件。

我使用bash -x SCRIPT.sh 进行调试输出。

我尝试过在线搜索,但找不到任何可以告诉我我可能做错了什么的东西。

这里有一个link 到更健全的电池通知脚本第 2 版,以便为我正在做的事情提供一些背景信息。

有人愿意解释一下吗?

提前致谢!

【问题讨论】:

  • 您的缩进与if/else/fis 的实际结构不匹配。 else 子句与 if [ $BatteryCapacity -le $CriticalAlert ] 相关,而不是 if [ "$BatteryStatus" = "$BatteryDischarging" ]
  • @GordonDavisson Yeahhh 我明白我是如何与语法对抗的......我使用不同的条件组织重写了整个内容。
  • 也代替反引号子shell来提取/sys值:read -r BatteryCapacity </sys/class/power_supply/BAT0/capacity; read -r BatteryStatus </sys/class/power_supply/BAT0/status

标签: bash loops if-statement while-loop


【解决方案1】:

您在第一个 sleep 10 之后放错了结束 fi

使用正确的缩进,您的代码如下所示:

if [ "$BatteryStatus" = "$BatteryDischarging" ]; then
    if [ $BatteryCapacity -le $CriticalAlert ]; then
        notify-send -u critical "Alert" "Battery Low!!!"
        echo "Success01"
        sleep 10
    else 
        if [ "A" = "A" ]; then 
            echo "Success02"
            sleep 10
        fi  
    fi  
fi

您可以看到 A=A 匹配是容量检查的 else,而不是状态。

您可以移动fi 或重写logc。像这样的:

while sleep 10; do
    if [ "$BatteryStatus" = "$BatteryDischarging" ] && [ $BatteryCapacity -le $CriticalAlert ]; then
            notify-send -u critical "Alert" "Battery Low!!!"
            echo "Success01"
    elif [ "A" = "A" ]; then 
            echo "Success02"
    fi
done

【讨论】:

猜你喜欢
  • 2014-01-21
  • 1970-01-01
  • 2012-12-02
  • 1970-01-01
  • 2021-03-18
  • 1970-01-01
  • 2017-01-15
  • 2015-05-19
  • 1970-01-01
相关资源
最近更新 更多