O uso do pipe permite que os comandos sejam executados em subshells diferentes, portanto, você recebe a mensagem de erro, pois os dois comandos ( [ e grep ) estão incompletos (os respectivos não funcionam como esperado).
Se você quiser apenas testar o código de resultado de um programa, não precisará usar [ … ] ou test , você precisará deles apenas para uma comparação mais distinta, como [ 1 -gt 2 ] ou [ "$1" == "$2" ] .
Se você quiser comparações ainda mais avançadas, como o uso de expressões regulares, use o comando [[ … ]] , consulte Construções de Teste
e Uma breve introdução às expressões regulares no 'Guia avançado de script de script'