"라인 1: $' :\r': 명령을 찾을 수 없습니다"라는 메시지가 나타나는 이유는 무엇입니까?

"라인 1: $' :\r': 명령을 찾을 수 없습니다"라는 메시지가 나타나는 이유는 무엇입니까?

내 노트북(DOS)에서 Cygwin을 사용하고 있습니다. 나는 동료들과 나 자신에게서 대본을 수집했습니다. 저는 IT 전문가가 아니며 Unix를 이해하지 못합니다. 나는 동료들의 문법을 따르고 몇 가지 간단한 일을 처리할 수 있습니다.

이 스크립트는 내 오래된 노트북에서 잘 실행됩니다. 방금 노트북을 바꾸고 Cygwin을 설치했습니다. 스크립트를 실행하면 작동하지 않습니다. 다음은 내가 받은 오류 메시지의 예입니다.

line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi

내 스크립트의 처음 5줄은 다음과 같습니다.

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

누군가 이 문제를 해결하는 방법을 설명해 줄 수 있나요?

답변1

Windows 스타일 줄 끝이 있습니다.

대조적으로, 무작동 명령은 :으로 읽혀지거나 :<carriage return>, 로 표시되거나 :\r, 더 완전히 로 표시됩니다 $':\r'.

그냥 달리면 dos2unix scriptname괜찮을 것입니다.


해당 항목이 없으면 dos2unix다음이 작동합니다.거의어디서나(Windows의 MobaXterm에서 테스트했습니다):

vi -b filename

그런 다음 vi다음을 입력하십시오.

:%s/\r$//
:x

이제 가셔도 됩니다.


vimCygwin 에서 사용하는 Cygwin에서는 vi이를 수행하는 여러 가지 방법이 있습니다. 다른 하나는 fileformat값을 취할 수 있는 설정 과 관련이 있습니다 dos. unix파일을 로드한 후 명시적으로 변경

파일 형식 설정=유닉스
또는 파일을 쓸 때 명시적으로 파일 형식을 강제 적용합니다.

:w +파일 형식=유닉스

이에 대한 자세한 내용은 다음을 포함하여 해당 주제를 다루는 많은 질문과 답변을 참조하세요.

답변2

이는 DOS 줄 끝을 사용하는 편집기(예: Notepad++)에 의해 스크립트가 저장되었기 때문입니다. 스크립트에서 이를 제거해야 합니다.

이렇게 하려면 dos2unix스크립트 파일을 사용하거나

$ tr -d '\r' <script >script.new && mv script.new script

(이렇게 하면 모든 캐리지 리턴이 제거됩니다.어딘가에스크립트에서)


스크립트의 코드는 다음과 같습니다.

:
iter=1
if [ -f iter.txt ]
   then rm ./iter.txt 
fi  

이것은 다음과 같이 보일 수 있습니다

iter=1
if [ -f "./$iter.txt" ]; then
   rm "./$iter.txt"
fi

1.txt현재 디렉터리에 파일이 있으면 삭제됩니다 . 이 :명령은 (거의) 아무 작업도 수행하지 않으며 삭제될 수 있습니다. 변수 iter의 값은 으로 사용해야 하며 $iter따옴표로 묶어야 합니다. 그러면 ./파일을 현재 디렉터리에서 찾아야 한다고 말할 때 필요 이상으로 더 명확해질 것입니다 .

이것을 루프로 전환하려는 경우(여기에서 모든 파일 1.txt, 2.txt, ... 제거 10.txt):

iter=1
while [ "$iter" -le 10 ]; then
    if [ -f "./$iter.txt" ]; then
        rm "./$iter.txt"
    fi
    iter=$(( iter + 1 ))
done

아니면 우리가 교활하거나 게으른 느낌이 든다면,

rm -f {1..10}.txt

중괄호 확장을 이해하는 쉘에서.

답변3

스크립트에 잘못된 줄 끝이 있습니다. Windows는 CR+LF(\r\n)를 사용하고 Unix는 LF(\n)를 사용하며 Classic MacOS는 CR(\r)을 사용합니다. 텍스트 편집기나 독립 실행형 도구(예 dos2unix: .

FTP 및 버전 제어 시스템(예: SVN)은 줄 끝을 적절하게 변환하는 경향이 있으므로 나중에 파일 전송을 위해 이러한 옵션을 살펴보는 것이 좋습니다.

만약 이 파일들이아니요전송 중이지만 단일 컴퓨터에서만 사용하려는 경우에는 선호하는 텍스트 편집기에서 줄 끝 설정을 찾아야 합니다. "프로그래머용"으로 판매되는 대부분의 제품에는 이 옵션이 있습니다.

답변4

dos2unix가 아니면 'flip'도 있습니다

$ 뒤집기 -u 파일 이름.txt

UNIX 줄 끝을 사용하려면 뒤집으세요.

관련 정보