Bash se baseado no resultado do grep dá erro "muitos argumentos"?

Bash se baseado no resultado do grep dá erro "muitos argumentos"?

Então, estou tentando saber se a máquina tem bateria e, em seguida, executar comandos diferentes dependendo se ela tem ou não. Aqui está o que tenho até agora:

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

No entanto, isso retorna o erro "bash: [: muitos argumentos" ao escrever NO BAT0 em /tmp/batstat conforme esperado. Executar apenas o grep funciona corretamente, então não entendo por que não funciona como uma condição if.

Se houver uma maneira melhor de verificar a bateria, estou 100% aberto a ela.

Responder1

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

ifpegará uma série de comandos e trabalhará no status do último, neste caso o grep. grepretorna verdadeiro se corresponder e falso caso contrário.

Responder2

grep -F BAT0 /tmp/batstatnão é de forma alguma uma EXPRESSÃO CONDICIONAL (conforme detalhado no manual) para o testbuiltin de bash. Como a saída de grepnão é utilizada, a -qopção e confiar no código de saída provavelmente é suficiente.

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

Além disso, /tmp/batstaté provavelmente uma escolha muito ruim, especialmente quando um usuário local nefasto tem acesso. Considere, em vez disso, usarmktemp(1)ou não localizar o arquivo em /tmp.

informação relacionada