Вопрос возврата каретки

У меня это в сценарии bash

DAY2="20130605"<Cr> echo "This is yesterday date:"$DAY2"end" 

Почему вывод следующий? Кажется, что в DAY2 есть возврат DAY2 но откуда он?

 ends is yesterday date:20130605 

5 Solutions collect form web for “Вопрос возврата каретки”

Возврат каретки возвращает курсор в начало строки. Ваша строка вывода:

  This is yesterday date:20130605<Cr>end 

Кроме того, когда терминал попадает в <Cr> он возвращает курсор в начало строки и перезаписывает символы, которые там есть .

Другими словами, «Thi» заменяется на «конец», производя:

  ends is yesterday date:20130605 

Чтобы сделать то, что вы пытаетесь сделать, ваш сценарий должен выглядеть примерно так:

  variable="text" echo "Some sentence $variable" 

Что будет выводить

  Some sentence text 

ЕСЛИ бывают бродячие возвращения каретки, они должны появиться как ^M в vi (как сказал Брюс)

Решение 1

Лучший способ удалить возвращаемые каретки или другие непечатаемые символы – это команда tr с параметром -d , которая удаляет любой экземпляр одного символа с \r который является escape-последовательностью для возврата каретки:

  tr -d '\r' 

Это приведет к удалению всех возвратов каретки. Запустите его на скрипте, чтобы удалить все экземпляры возвратов каретки, а затем перезапишите исходный файл сценария:

  tr -d '\r' yourscript.bash > temp mv temp yourscript.bash 

Решение 2

или пока в vi с открытым скриптом введите:

  :%s/\r//g :wq 

Чтобы удалить возвращаемые каретки в документе, сохраните его.

Предполагая, что <Cr> представляет возврат каретки, удалите возврат каретки с конца первой строки. Вот вам один лайнер, чтобы сделать это за вас:

 sed -i '1s/\r//' script.sh 

Чтобы увидеть возврат каретки в вашем скрипте, запустите следующее.

 od -c script.sh | grep --color=yes '\r' 

Используйте vi или vim чтобы посмотреть на рассматриваемый сценарий bash. Вы должны увидеть, что любые измененные каретки возвращаются в виде двухсимвольных последовательностей '^ M' (карет, em). Используйте hjkl для перемещения курсора по каретке, нажмите «x», чтобы удалить их, затем «: wq», чтобы выйти из vi .

Мое предположение заключалось бы в том, что в файл попал бродячий возврат каретки, когда кто-то переместил файл на компьютер под Windows, отредактировал его с помощью Блокнота или Wordpad, а затем переместил его обратно в linux.

Точно как это возвращение каретки было трудно сказать.

Если скрипт был сгенерирован другим скриптом или приложением, это может быть ошибка или намеченная ошибка.

Скорее всего, вы или кто-либо отредактировал файл, непреднамеренно нажали комбинацию клавиш, в результате чего CR был вставлен.

Примеры:

  • vim : Ctrl-v Ctrl-m
  • emacs: Ctrl-q Ctrl-m
  • И многие другие.

Существуют и другие символы, которые могут вызвать проблемы, например, отсутствие пробела в коде и т. Д. Это обычно вызывает странные ошибки при запуске скриптов или компиляции кода.

Обычно я использую vim и часто устанавливаю (используйте комбинацию клавиш для переключения):

 match Error /[^ -~\t]/ 

То есть: выделите все, кроме <space> до ~ в ASCII, и tab с Error , обычно белым цветом на красном и т.д.

Для файлов кода, как правило, это установлено по умолчанию.


В возврате каретки терминала обычно курсор перемещается в начало строки, поэтому любая печать после того, как она переписывает любой существующий текст на этой строке, пока не появится строка строки.

Например:

 #!/bin/bash for i in {1..100}; do printf "We are now at %3d%%\r" "$i" sleep .1 done printf "\nAll done.\n" 

\r , при использовании printf результат <CR> или возврат каретки.
\n , при использовании printf результат <LF> или Line Feed.

В сценариях оболочки CR является обычным символом, а не пробелом, как на многих других языках. Эта строка DAY2="20130605"<Cr> устанавливает DAY2 в 9- DAY2 строку, она эквивалентна DAY2=$'20130605\r' . echo линия эквивалентна echo $'This is yesterday date:20130605\rend' . Символ CR ( $'\r' ) перемещает курсор в начало строки, таким образом ( ¡ указывает местоположение курсора):

 This is yesterday date:¡ #after printing up to date: This is yesterday date:20130605¡ #after printing up to 20130605 ¡This is yesterday date:20130605 #after printing the CR end¡s is yesterday date:20130605 #after printing end 

Удалите CR из скрипта.

  • Повторить последнюю команду N раз
  • Очистить историю bash, за исключением последних n строк
  • дата: следующий следующий час
  • Удалить завершающую новую строку из «буфера обмена», чтобы предотвратить выполнение на терминале?
  • Не удалось получить команду для работы с bash -c
  • Пожалуйста, объясните параметр -f в pgrep
  • Одинарная кавычка в двойных кавычках и справочное руководство Bash
  • Как выйти из режима поиска истории bash?
  • Как переменные могут использовать «~» для cd'ing?
  • Как правильно это перечислить с помощью инструментов Unix для pdfjam?
  • Генерировать случайные числа в определенном диапазоне
  • Interesting Posts

    удаление всех вхождений данной команды из истории

    Механизм разрешения файлов в Unix-подобных системах

    Каков безопасный формат жесткого диска для архивирования данных в хранилище данных?

    мой Wi-Fi Wireless-N 2230 не может подключаться случайно

    dzen2 как определить фактическое разрешение и количество мониторов

    Где находится файл конфигурации по умолчанию для принтера по умолчанию?

    Ubuntu и Mint замедляют хост, быстро на VM

    настройка SSH обратного туннеля

    Как установить горячую точку, которая проксимизирует все соединения с tor?

    как получить espeak, чтобы постоянно говорить stdout, переданный из netcat

    Ограничение частоты использования / частоты использования энергии

    IP-адрес в Linux продолжает пересылать на другой

    Самый быстрый и эффективный способ удаления строк, содержащих строки (строки, перечисленные в другом текстовом файле)

    О выполнении сценария оболочки

    Временно заморозить процесс при взаимодействии оболочки

    Linux и Unix - лучшая ОС в мире.