#bash
#bash
Вопрос:
Я уже некоторое время возился с этим скриптом bash, но я недостаточно знаком со скриптами bash, чтобы разобраться в проблеме. Вот мой скрипт:
#!/usr/bin/bash
# Battery level warning script
NOTIFIED=0
while true; do
BATTERY_LEVEL=$(cat /sys/class/power_supply/BAT0/capacity)
STATE=$(cat /sys/class/power_supply/BAT0/status)
echo "beep"
# notify user of battery level
if [ $STATE == "Discharging" ] ; then
echo "Discharging"
if [ $NOTIFIED -lt "1" amp;amp; $BATTERY_LEVEL -lt "50" amp;amp; $BATTERY_LEVEL -gt "10" ]; then
echo "Battery >10%, < 50%"
sudo -u korgan DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Battery low warning" "Battery level is ${BATTERY_LEVEL}%" --icon=battery-low
NOTIFIED=1
elif [ $NOTIFIED -lt "2" amp;amp; $BATTERY_LEVEL -lt "11" amp;amp; $BATTERY_LEVEL -gt "5" ]; then
echo "Battery >5%, <11%"
sudo -u korgan DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Battery very low warning" "Battery level is ${BATTERY_LEVEL}% Use ac power now, or shutdown is imminent - close applications" --icon=battery-caution
NOTIFIED=2
elif [ $NOTIFIED -lt "3" amp;amp; $BATTERY_LEVEL -lt "6" ]; then
echo "Battery <6%"
sudo -u korgan DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send "Battery critical warning" "Battery level is ${BATTERY_LEVEL}% Shutting system down now"
NOTIFIED=3
fi
elif [ $STATE == "Charging" ]; then
echo "Charging"
NOTIFIED=0
fi
if [ $BATTERY_LEVEL -gt "60" ]; then
echo "Battery > 60%: waiting 10 secs"
sleep 10
else
echo "Battery <=60%: waiting 5 secs"
sleep 5
fi
done
Цель состоит в том, чтобы получать уведомления-отправлять предупреждения, когда моя батарея разряжается и при определенных уровнях заряда. Ошибка, которую я получаю, это
./battery_check.sh: line 16: [: missing `]'
./battery_check.sh: line 20: [: missing `]'
./battery_check.sh: line 24: [: missing `]'
Battery > 60%: waiting 10 secs
Комментарии:
1. Возможно ли, что
STATE
вообще не установлено?2. ShellCheck автоматически обнаруживает распространенные проблемы, подобные этой
Ответ №1:
Изменить:
if [ $NOTIFIED -lt "1" amp;amp; $BATTERY_LEVEL -lt "50" amp;amp; $BATTERY_LEVEL -gt "10" ]; then`
Для
if [ "$NOTIFIED" -lt "1" ] amp;amp; [ "$BATTERY_LEVEL" -lt "50" ] amp;amp; [ "$BATTERY_LEVEL" -gt "10" ]; then ....`
Комментарии:
1. Опереди меня! Да, вы должны поместить каждое выражение между [ ] и использовать amp;amp; операнд между ними
2.Дальнейшее объяснение:
[
это обычная команда, а не специальный синтаксис оболочки.amp;amp;
это специальный синтаксис, который объединяет две команды, запуская вторую при успешном выполнении первой.[
однако есть одна особенность: последний аргумент должен быть]
, поэтому вы получаете эту ошибку вместо ошибки «команда не найдена» для любого значения$BATTERY_LEVEL
. (Замените[
наtest
, у которого нет обязательного конечного аргумента, чтобы увидеть ошибку command-not-found.)
Ответ №2:
У вас синтаксические ошибки в 16-й, 20-й и 24-й строках. Это должно быть
if [ $NOTIFIED -lt "1" ] amp;amp; [ $BATTERY_LEVEL -lt "50" ] amp;amp; [ $BATTERY_LEVEL -gt "10" ];