
Итак, я пытаюсь определить, есть ли у машины батарея, а затем запускать различные команды в зависимости от того, есть она или нет. Вот что у меня есть на данный момент:
upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
echo "BAT0 PRESENT" >> /tmp/batstat
else
echo "NO BAT0" >> /tmp/batstat
fi
Однако это возвращает ошибку "bash: [: too many arguments" при записи NO BAT0 в /tmp/batstat, как и ожидалось. Запуск только grep работает правильно, поэтому я не понимаю, почему это не работает как условие if.
Если есть лучший способ проверить аккумулятор, я на 100% его рассмотрю.
решение1
if upower -d | grep -qF BAT0 ; then
echo "BAT0 PRESENT"
else
echo "NO BAT0"
fi
if
принимает ряд команд и работает со статусом последней из них, в этом случае grep. grep
возвращает true, если совпадение, и false в противном случае.
решение2
grep -F BAT0 /tmp/batstat
никоим образом не является УСЛОВНЫМ ВЫРАЖЕНИЕМ (как подробно описано в прекрасном руководстве) для test
встроенной функции bash
. Поскольку вывод grep
не используется, -q
вариант и опора на код выхода, вероятно, достаточны.
grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
echo yea
else
echo nay
fi
Также, /tmp/batstat
вероятно, очень плохой выбор, особенно если доступ имеет злонамеренный локальный пользователь. Рассмотрите вместо этого использованиеmktemp(1)
или не нахождение файла в папке /tmp
.