¿Bash si se basa en el resultado de grep da un error de "demasiados argumentos"?

¿Bash si se basa en el resultado de grep da un error de "demasiados argumentos"?

Así que estoy tratando de saber si la máquina tiene batería y luego ejecuto diferentes comandos en función de si la tiene o no. Esto es lo que tengo hasta ahora:

upower -d >> /tmp/batstat
if [ grep -F BAT0 /tmp/batstat ]; then
    echo "BAT0 PRESENT" >> /tmp/batstat
else
    echo "NO BAT0" >> /tmp/batstat
fi

Sin embargo, esto devuelve el error "bash: [: demasiados argumentos" al escribir NO BAT0 en /tmp/batstat como se esperaba. Ejecutar solo grep funciona correctamente, por lo que no entiendo por qué no funciona como condición if.

Si hay una mejor manera de comprobar si hay una batería, estoy 100% abierto a ello.

Respuesta1

if upower -d | grep -qF BAT0 ; then
   echo "BAT0 PRESENT"
else
   echo "NO BAT0"
fi

ifTomará una serie de comandos y trabajará en el estado del final, en este caso el grep. grepdevuelve verdadero si coincide y falso en caso contrario.

Respuesta2

grep -F BAT0 /tmp/batstatno es de ninguna manera una EXPRESIÓN CONDICIONAL (como se detalla en el manual fino) para la testfunción incorporada de bash. Dado que la salida de grepno se utiliza, la -qopción y confiar en el código de salida probablemente sea suficiente.

grep -F -q BAT0 batstat
if [[ $? -eq 0 ]]; then
    echo yea
else
    echo nay
fi

Además, /tmp/batstates probable que sea una muy mala elección, especialmente cuando un usuario local nefasto tiene acceso. Considere en su lugar usarmktemp(1), o no localizar el archivo en /tmp.

información relacionada