Intereting Posts
Сценарий оболочки для уведомления BackupPC не работает Цикл выполнения sed s / REGEXP / REPLACEMENT / g Как я могу объединить один столбец вывода в список? Можно ли сделать здесь-документ в одной строке или эхо-дословно? разрешить доступ к символической ссылке, когда chrooted в домашнем каталоге Есть ли макет программы, которая использует процессор на нескольких ядрах? Проблема с запуском vlc в Openindiana Eclipse недавно установлен с официального репо: JVM завершен, код выхода = 1 tor работает, когда его в / usr / bin, но не в / usr / sbin / Владельцы файлов svn и webserver Почему echo> file использует больше реального времени, чем echo | sed> файл? Переустановка только пакетов с отсутствующими или поврежденными файлами в нерабочей системе? Почему `find` не удаляет найденные файлы? Можно ли использовать полный Ubuntu на загрузочном жестком диске? Избегайте конечной косой черты в bash при заполнении имени каталога (например, zsh)

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

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

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

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

 ends is yesterday date:20130605 

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

      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 из скрипта.