Antes de mais nada, você deve salvar o conteúdo de $? o mais rápido possível, porque cada comando é executado sobrescrevendo seu conteúdo. No seu caso, o $? na instrução if é o status de saída do echo anterior, não de mvn .
Em seguida, para comparação aritmética em bash (e sh ) você precisa usar -ne para diferente de .
Então eu sugiro:
mvn compile
status="$?"
echo "$status"
if [ $status -ne 0 ]; then
echo "is not 0"
else
echo "is 0"
fi
Mas isso poderia ser feito de maneira mais elegante com
if ! mvn compile; then
echo "is not 0"
else
echo "is 0"
fi