эхо-печать переменных в одну строку
Вопрос
У меня есть две переменные:
export portNumber=8888^M
export loginIP_BASE=10.1.172.2^M
Я пытаюсь вывести их в одну строку, разделенную двоеточием ':'. Это должно выглядеть как «10.1.172.2: 8888»
echo -n 'Login IP:'
echo -n $loginIP_BASE
echo -n ':'
echo $portNumber
но вместо этого он печатает это:
:8888 IP:10.1.172.2
Почему он это делает? Как я могу заставить его делать то, что я хочу?
Кроме того, переменные уже существуют в другом файле, поэтому я не написал их сам. Что означает "^ M" делать?
Решение
Файл был перенесен из Windows в двоичном режиме и по-прежнему содержит символы возврата каретки на концах строк.
Это ваши символы ^ M
, и они заставляют текстовую позицию возвращаться к началу строки, когда отображаются значения - возврат каретки в конце первого значения делает второе значение снова отображается в начале строки, перезаписывая часть первого значения.
Правильное исправление заключается в передаче файла из Windows с помощью переноса в текстовом режиме или запуске dos2unix для файла после его передачи. (Или если файл не будет перенесен из Windows снова, просто удалите символы ^ M
!)
Другие советы
В Windows типичной новой строкой является \ r \ n (в * nix системах это просто \ n).
\ r - возврат каретки.
\ n - новая строка.
^ M равно \ r , поэтому после написания $ loginIP_BASE вы находитесь в позиции 0 фактической строки.
Если вы хотите удалить все эти ^ M, вы можете сделать это vim o с помощью sed с помощью:
sed s/{ctrl+v}{ctrl+m}// file > new_file
({Ctrl + v} означает, нажмите Ctrl, а затем v)
Используйте команду dos2unix:
dos2unix filename
Еще один трюк для удаления Ctrl + M в редакторе vi:
:%s/^V^M//g