Bash, а l oop с оператором if, застрявшим в истинном цикле - PullRequest
0 голосов
/ 11 апреля 2020

Я работаю над сценарием уведомления о батарее.

Извиняюсь за то, что это кусочек отладочного кода на данный момент.

Вот код, который у меня есть до сих пор ...

#!/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 не равен разряде и заряжается или полностью, программа застрянет в ...

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

Я запутался почему программа застревает в + '[' Charging = Discharging ']' + true l oop, а не переходит в другое условие.

Я использую bash -x SCRIPT.sh для вывода отладки.

Я пытался искать в Интернете, но не могу найти ничего, что бы указывало на то, что я могу делать неправильно.

Вот ссылка на более вменяемую версию 2 скрипта уведомления о батарее, чтобы дать некоторый контекст тому, что я делаю.

Кто-нибудь хочет получить объяснение?

Заранее спасибо!

1 Ответ

0 голосов
/ 12 апреля 2020

Вы неправильно поместили закрывающее fi после первого sleep 10

При правильном отступе ваш код выглядит следующим образом:

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 соответствует это еще одна проверка Capacity, а не Status.

Вы можете переместить fi или переписать журнал c. Как то так:

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
...