Como muitos outros observaram, "-n" é interpretado literalmente se colocado em qualquer lugar, mas imediatamente após o echocomando.
Historicamente, os utilitários UNIX eram todos assim - eles procuravam opções apenas imediatamente após o nome do comando. Provavelmente, o BSD ou o GNU foram os pioneiros no estilo mais flexível (embora eu possa estar errado), pois até agora o POSIX especifica a maneira antiga como correta (consulte a Diretriz 9 e também man 3 getoptem um sistema Linux). De qualquer forma, embora a maioria dos utilitários Linux hoje em dia use o novo estilo, existem alguns exemplos echo.
Echoé uma bagunça, em termos de padrões, em que havia pelo menos duas versões fundamentalmente conflitantes em jogo quando o POSIX surgiu. Por um lado, você tem o estilo SYSV, que interpreta caracteres com escape de barra invertida, mas trata seus argumentos literalmente, não aceitando opções. Por outro lado, você tem o estilo BSD, que trata uma inicial -ncomo um caso especial e gera absolutamente tudo o resto literalmente. E, como echoé tão conveniente, você tem milhares de scripts de shell que dependem de um comportamento ou de outro:
echo Usage: my_awesome_script '[-a]' '[-b]' '[-c]' '[-n]'
echo -a does a thing.
echo -b does something else.
echo -c makes sure -a works right.
echo -- DON\'T USE -n -- it\'s not finished! --
Por causa da semântica "tratar tudo literalmente", é impossível adicionar uma nova opção echosem quebrar as coisas. Se o GNU usasse o esquema de opções flexíveis, o inferno se abriria.
Aliás, para melhor compatibilidade entre implementações de shell Bourne, use em printfvez deecho .
ATUALIZADO para explicar por que, echoem particular, não usa opções flexíveis.
echo -n "bar"dá "bar", enquantoecho "bar" -ndá "bar -n"