O problema é que você está usando ==
como o operador de igualdade (que o bash suporta), mas depois executa o script em sh
, que não o suporta. A solução é substituir:
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
Com:
if [ $? = 0 ] ; then echo "A"; else echo "B"; fi
Isso funcionará sob bash
e simples sh
.
Embora possa não fazer diferença neste caso específico, =
é uma comparação de strings. Para testar a igualdade numérica, deve-se usar -eq
:
if [ $? -eq 0 ] ; then echo "A"; else echo "B"; fi
Exemplo com ==
Considere este arquivo de script:
$ cat script.sh
grep "apple" fruits.txt
if [ $? == 0 ] ; then echo "A"; else echo "B"; fi
Ele é executado sob o bash:
$ bash script.sh
apple
A
Ele falha em traço (dash é o padrão sh em sistemas parecidos com o debian):
$ dash script.sh
apple
script.sh: 2: [: 0: unexpected operator
B
Com exceção do número da linha, você pode ver que essa mensagem de erro corresponde ao que você está vendo.
Simplificações
Não há necessidade de acessar $?
diretamente. O código pode ser simplificado para:
$ if grep "apple" fruits.txt; then echo "A"; else echo "B"; fi
apple
A
Ou usando os operadores lógico-e, &&
e lógico-ou, ||
,
grep "apple" fruits.txt && echo A || echo B
Os trabalhos acima porque echo A
, se executado, sempre retornará sucesso.