문제 입력

문제 입력

나는 이것을 bash 스크립트에 가지고 있습니다

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

출력이 다음과 같은 이유는 무엇입니까? 캐리지 리턴 문자가 있는 것 같은데 DAY2어디서 나오는 걸까요?

ends is yesterday date:20130605

답변1

Enter를 누르면 커서가 줄의 시작 부분으로 돌아갑니다. 출력 문자열은 다음과 같습니다:

    This is yesterday date:20130605<Cr>end

터미널이 클릭되지 않는 한<Cr> 커서를 줄의 시작 부분으로 되돌리고 거기에 있는 문자를 덮어씁니다..

즉, "Thi"가 "end"로 대체되어 다음이 생성됩니다.

    ends is yesterday date:20130605

수행하려는 작업을 수행하려면 스크립트는 다음과 같아야 합니다.

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

어느 것이 출력될 것인가

   Some sentence text

잘못된 캐리지 리턴이 있는 경우 ^M( viBruce가 말했듯이) 로 표시되어야 합니다.

솔루션 1

캐리지 리턴이나 기타 인쇄되지 않는 문자를 제거하는 가장 좋은 방법은 단일 문자의 모든 인스턴스를 제거하는 tr옵션과 함께 명령을 사용하는 것입니다. 여기서 캐리지 리턴 문자의 이스케이프 시퀀스는 다음과 같습니다.-d\r

    tr -d '\r'

그러면 모든 캐리지 리턴이 제거됩니다. 스크립트에서 다음을 실행하여 캐리지 리턴의 모든 인스턴스를 제거한 다음 원본 스크립트 파일을 덮어씁니다.

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

솔루션 2

또는 vi스크립트를 열 때 다음을 입력하십시오.

    :%s/\r//g
    :wq

문서에서 캐리지 리턴을 제거하려면 문서를 저장하세요.

답변2

캐리지 리턴을 나타내는 경우 <Cr>첫 번째 줄 끝에서 캐리지 리턴을 제거합니다. 귀하가 수행할 수 있는 작업은 다음과 같습니다.

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

스크립트에서 캐리지 리턴을 보려면 다음 명령을 실행하십시오.

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

답변3

문제의 bash 스크립트를 사용하거나 vi확인 하세요. vim잘못된 캐리지 리턴이 "^M"(캐럿, em) 두 문자 시퀀스로 표시되어야 합니다. hjkl을 사용하여 커서를 캐리지 리턴으로 이동하고 "x"를 클릭하여 삭제한 다음 ":wq"를 클릭하여 종료합니다 vi.

내 생각엔 누군가 파일을 Windows 컴퓨터로 이동하고 메모장이나 워드패드로 편집한 다음 다시 Linux로 이동하면 잘못된 캐리지 리턴이 파일에 나타나는 것 같습니다.

답변4

캐리지 리턴 문자가 어떻게 생성되는지 정확하게 말하기는 어렵습니다.

스크립트가 다른 스크립트나 애플리케이션에 의해 생성된 경우 버그이거나 의도적인 사고일 수 있습니다.

CR파일을 편집하는 사람이 실수로 삽입을 유발한 키 조합을 눌렀을 가능성이 있습니다.

예:

  • vim : Ctrl-v Ctrl-m
  • emacs: Ctrl-q Ctrl-m
  • 다른 많은 것들이 있습니다.

코드에 줄 바꿈이 없는 등 문제를 일으킬 수 있는 다른 문자도 있습니다. 이로 인해 스크립트를 실행하거나 코드를 컴파일할 때 종종 이상한 오류가 발생합니다.

저는 보통 이 기능 vim을 자주 사용하고 설정합니다(토글할 수 있는 키 조합이 있습니다):

match Error /[^ -~\t]/

즉, ASCII와 with를 사용하여 <space>일반적으로 빨간색 배경에 흰색 텍스트 등을 제외한 모든 콘텐츠를 강조 표시합니다.~tabError

코드 파일의 경우 일반적으로 기본적으로 열어 둡니다.


터미널에서 캐리지 리턴은 일반적으로 커서를 줄의 시작 부분으로 이동하게 하므로 인쇄할 때 줄 바꿈이 발생할 때까지 해당 줄의 기존 텍스트를 덮어씁니다.

예를 들어:

#!/bin/bash

for i in {1..100}; do
    printf "We are now at %3d%%\r" "$i"
    sleep .1
done

printf "\nAll done.\n"

\rprintf, 결과 <CR>또는 캐리지 리턴을 사용할 때 . , 결과 또는 개행 문자를
\n사용할 때 .printf<LF>

관련 정보