É tradição do serverfault não questionar indevidamente as condições prévias, mas tenho que perguntar: não é possível você 1) montar o sistema de arquivos remoto via SMB, ou 2) usar o fuse / sshfs? (Eu assumo aqui que a máquina de envio é uma caixa do Linux enquanto você está usando bash e ssh.)
Para responder a sua pergunta, acho que seu problema é simples. Considere:
quest@wonky:~$ false
quest@wonky:~$ if [ $? != "0" ] ; then echo asdf ; fi
asdf
quest@wonky:~$ if [ $? != "0" ] ; then echo asdf ; fi
Tente ao invés disso:
quest@wonky:~$ false
quest@wonky:~$ res=$?
quest@wonky:~$ if [ $res != "0" ] ; then echo asdf ; fi
asdf
quest@wonky:~$ if [ $res != "0" ] ; then echo asdf ; fi
asdf
Para explicar: sua segunda instrução if "if [$?!=" 0 "]; depois" testa o status de saída da última instrução, que não é mais sftp, mas a instrução if anterior.
Então eu imagino, o sftp realmente sairá com um valor diferente de zero se tiver problemas para fazer o upload de arquivos? Testes de rastreamento indicam que o meu não.