Bash se, com base no resultado do grep, aparecer um erro “too many arguments”?

0

Estou tentando dizer se a máquina tem uma bateria e, em seguida, executar comandos diferentes com base no fato de ela funcionar ou não. Aqui está o que eu 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: [: too many arguments" ao gravar NO BAT0 em / tmp / batstat conforme o esperado. Rodando apenas o grep funciona corretamente, então eu não entendo porque ele não funciona como uma condição if.

Se houver uma maneira melhor de verificar se há uma bateria, estou 100% aberto para ela.

    
por user5104897 15.12.2016 / 19:39

2 respostas

3

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

if terá uma série de comandos e funcionará no status do final, neste caso o grep. grep retornará verdadeiro se corresponder e falso caso contrário.

    
por 15.12.2016 / 21:29
0

grep -F BAT0 /tmp/batstat não é de forma alguma uma EXPRESSÃO CONDICIONAL (conforme detalhado no manual de instruções) para o test incorporado em bash . Como a saída de grep não é usada, a opção -q e a confiança no código de saída provavelmente são suficientes.

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, usar mktemp(1) ou não localizar o arquivo em /tmp .

    
por 15.12.2016 / 20:34