echo impressão variáveis ??em uma única linha
Pergunta
Eu tenho duas variáveis:
export portNumber=8888^M
export loginIP_BASE=10.1.172.2^M
Eu estou tentando imprimi-los tanto em uma única linha separados por dois pontos ':'. Deve olhar como "10.1.172.2:8888"
echo -n 'Login IP:'
echo -n $loginIP_BASE
echo -n ':'
echo $portNumber
mas ele imprime esta em vez disso:
:8888 IP:10.1.172.2
Por que ele está fazendo isso? Como posso obtê-lo para fazer o que eu quero?
Além disso, as variáveis ??são pré-existente de outro arquivo, então eu não escrevê-los sozinho. O que faz o "^ M" fazer?
Solução
O arquivo foi transferido a partir do Windows em modo binário, e ainda tem caracteres retorno de carro no fim das linhas.
Eles são os seus símbolos ^M
, e eles estão fazendo com que a posição do texto para voltar ao início da linha quando os valores são exibidos - o retorno de carro no final do primeiro valor faz a segunda indicação do valor no início do linha novamente, substituindo parte do primeiro valor.
A correção direita é para transferir o arquivo a partir do Windows usando a transferência de modo de texto, ou para executar dos2unix no arquivo depois que você transferiu. (Ou se o arquivo não vai ser transferido a partir do Windows novamente, basta apagar os personagens ^M
!)
Outras dicas
No Windows uma nova linha típica é \ r \ n (em sistemas * nix é apenas \ n).
\ r é retorno de carro.
\ n é nova linha.
^ M é \ r , por isso depois de escrever $ loginIP_BASE você está na posição 0 da linha real.
Se você quiser remover todos aqueles ^ M você pode fazê-lo no vim o com sed usando:
sed s/{ctrl+v}{ctrl+m}// file > new_file
({Ctrl + v} significa pressionar ctrl e, em seguida, v)
Use o comando dos2unix:
dos2unix filename
Mais um truque para remover Ctrl + M no vi editor:
:%s/^V^M//g