내 노트북(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
이제 가셔도 됩니다.
vim
Cygwin 에서 사용하는 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 줄 끝을 사용하려면 뒤집으세요.