我一直在嘗試為 15%、10% 和 5% 的電池通知制作腳本。當電池達到這些水平時,它會顯示一條通知,說要更換我的筆記本電腦。我創建了一個名為 runOnce 的變數來說明腳本是否已經執行過一次 if 陳述句。如果 runOnce 為 false,則在 while 回圈中運行 if 陳述句,如果其中一個為 true,則執行命令,然后將 runOnce 設定為 true,停止 while 回圈。但是,由于我需要回圈整個代碼,因此它還將 runOnce 重置為 false。因此,如果電池電量仍然相同,它會重復執行這些命令。我嘗試了不同的解決方案,但我不知道如何不讓腳本將變數重置為 false。
while true; do
battery=$(cat /sys/class/power_supply/BAT0/capacity)
batteryStatus=$(cat /sys/class/power_supply/BAT0/status)
runOnce=false
if [ $batteryStatus != "Charging" ]; then
while [ "$runOnce" = false ]; do
runOnce=false
if [ $battery -eq 15 ]; then
notify-send --urgency=critical "Low Battery! (15%)" "Charge your laptop quickly."
espeak "Low battery. Please charge."
runOnce=true
elif [ $battery -eq 10 ]; then
notify-send --urgency=critical "Critical Battery! (10%)" "Charge your laptop now. Before you lose your data. Seriously."
espeak "Critical battery. Please charge."
runOnce=true
elif [ $battery -eq 5 ]; then
notify-send --urgency=critical "REALLY Critical Battery! (5%)" "Dude, your battery is going to go to the landfill soon."
espeak "Critical battery. Charge immediately."
runOnce=true
fi
done
fi
sleep 5
done
uj5u.com熱心網友回復:
你必須“記住狀態”。你必須“記住”什么電池在運行之間處于什么狀態——類似于“高于”回圈。僅在狀態變化時顯示訊息 - 當從正常電壓變為低電壓或從低電壓變為臨界電壓時。讓我們做一些重構:
display_low() {
notify-send --urgency=critical "Low Battery! (15%)" "Charge your laptop quickly."
espeak "Low battery. Please charge."
}
display_crit() {
notify-send --urgency=critical "Critical Battery! (10%)" "Charge your laptop now. Before you lose your data. Seriously."
espeak "Critical battery. Please charge."
}
display_really_crit() {
notify-send --urgency=critical "REALLY Critical Battery! (5%)" "Dude, your battery is going to go to the landfill soon."
espeak "Critical battery. Charge immediately."
}
battery_to_state() {
battery=$1
# lets use bash syntax
if (( battery <= 5 )); then
echo really_crit
elif (( battery <= 10 )); then
echo crit
elif (( battery <= 15 )); then
echo low
fi
# if greater than 15, state is empty
}
laststate=
while true; do
batteryStatus=$(cat /sys/class/power_supply/BAT0/status)
battery=$(cat /sys/class/power_supply/BAT0/capacity)
curstate=$(battery_to_state "$battery")
if
# Only display when not charging
[[ "$batteryStatus" != "Charging" ]] &&
# Only display if the state is not empty (below 15!)
[[ -n "$curstate" ]] &&
# Only display if the state __changed__!
[[ "$laststate" != "$curstate" ]]
then
# jump to one of display_* functions, depending on state
"display_$curstate"
fi
laststate=$curstate
#
sleep 5
done
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/483466.html
