experimentar
if ! grep -q sysa /etc/passwd ; then
grepretorna truese encontrar o alvo de pesquisa e falsese não encontrar.
Então NÃO false== true.
if a avaliação em shells é projetada para ser muito flexível e muitas vezes não requer cadeias de comandos (como você escreveu).
Além disso, olhando seu código como está, seu uso da $( ... )forma de substituição do cmd deve ser recomendado, mas pense no que está saindo do processo. Tente echo $(cat /etc/passwd | grep "sysa")ver o que eu quero dizer. Você pode levar isso adiante usando a -copção (count) para grep e depois executar o if ! [ $(grep -c "sysa" /etc/passwd) -eq 0 ] ; thenque funciona, mas é bastante antigo.
MAS, você pode usar os recursos mais recentes do shell (avaliação aritmética) como
if ! (( $(grep -c "sysa" /etc/passwd) == 0 )) ; then ...`
o que também oferece o benefício de usar os operadores de comparação baseados em c-lang ==,<,>,>=,<=,%e talvez alguns outros.
Nesse caso, por um comentário de Orwellophile, a avaliação aritmética pode ser reduzida ainda mais, como
if ! (( $(grep -c "sysa" /etc/passwd) )) ; then ....
OU
if (( ! $(grep -c "sysa" /etc/passwd) )) ; then ....
Finalmente, há um prêmio chamado Useless Use of Cat (UUOC). :-) Algumas pessoas vão pular para cima e para baixo e chorar gothca! Vou apenas dizer que greppode ter um nome de arquivo em sua linha de cmd, então por que invocar processos e construções de tubulação extras quando você não precisa? ;-)
Eu espero que isso ajude.
!não deve estar dentro dos colchetes? ie[ ! EXPR ]