Вопрос

У меня есть две переменные:

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top