Bash, если на основе результата grep выдает ошибку «слишком много аргументов»?

Bash, если на основе результата grep выдает ошибку «слишком много аргументов»?

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

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.

Связанный контент