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.