variables de impresión de eco en una sola línea
Pregunta
Tengo dos variables:
export portNumber=8888^M
export loginIP_BASE=10.1.172.2^M
Estoy tratando de imprimirlos a ambos en una sola línea separada por dos puntos ':'. Debería verse como "10.1.172.2: 8888"
echo -n 'Login IP:'
echo -n $loginIP_BASE
echo -n ':'
echo $portNumber
pero imprime esto en su lugar:
:8888 IP:10.1.172.2
¿Por qué está haciendo eso? ¿Cómo puedo hacer que haga lo que quiero?
Además, las variables son preexistentes de otro archivo, por lo que no las escribí yo mismo. ¿Qué significa el " ^ M " hacer?
Solución
El archivo se ha transferido desde Windows en modo binario y todavía tiene caracteres de retorno de carro al final de las líneas.
Son sus símbolos ^ M
, y están haciendo que la posición del texto regrese al inicio de la línea cuando se muestran los valores: el retorno de carro al final del primer valor hace que segundo valor visualizado al comienzo de la línea nuevamente, sobrescribiendo parte del primer valor.
La solución correcta es transferir el archivo desde Windows mediante transferencia de modo de texto o ejecutar dos2unix en el archivo después de haberlo transferido. (O si el archivo no se va a transferir desde Windows nuevamente, ¡simplemente elimine los caracteres ^ M
!)
Otros consejos
En Windows, una nueva línea típica es \ r \ n (en los sistemas * nix es solo \ n).
\ r es retorno de carro.
\ n es una nueva línea.
^ M es \ r , así que después de escribir $ loginIP_BASE está en la posición 0 de la línea real.
Si desea eliminar todos esos ^ M, puede hacerlo en vim o con sed usando:
sed s/{ctrl+v}{ctrl+m}// file > new_file
({Ctrl + v} significa presionar ctrl y luego v)
Use el comando dos2unix:
dos2unix filename
Un truco más para eliminar Ctrl + M en el editor vi:
:%s/^V^M//g