아래 코드를 사용하여 파일을 쉽게 호출할 수 있도록 명령을 파일에 저장하려고 합니다.
./test
이 코드를 실행해야 합니다.
Set n=0 ; foreach sql ( *_*.sql)
foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End
echo You changed $n files
나는 다음을 입력했습니다.
set n = 0 > test
foreach sql ( *_*.sql) >> test
여기까지 왔을 때 터미널에 빈 줄이 나타나서 다음 3줄을 블라인드 입력했습니다.
foreach? sed “s/_/-/g” $sql
foreach? @ n ++
foreach? End
그런 다음 다음으로 끝납니다.
echo 'echo You changed $n files' >> test
완료되면 출력 파일에는 다음 콘텐츠만 포함됩니다.
foreach? sed "s/_/-/g" $sql
foreach? @ n ++
foreach? end
echo You changed $n file
set 명령과 foreach 루프의 시작이 완전히 누락되었습니다. 내가 여기서 무엇을 놓치고 있는 걸까요? 아니면 단순히 불가능합니까?
편집됨
#!/bin/tcsh
set n=0
foreach sql ( *_*.sql )
sed "s/_/-/g" $sql
@ n ++
end
echo You changed $n files
chmod 777 test
답변1
쉘 명령줄에서 작업을 수행하려고 하면 문제가 많습니다. echo
방향을 바꿔야 해모든현재 쉘에서 해석되어 생성 중인 파일에 배치되지 않도록 쉘 메타 문자를 인용해야 합니다. test
파일을 편집하고 파일에 직접 쉘 명령을 입력하려면 텍스트 편집기를 사용하는 것이 가장 좋습니다 .
답변2
스크립트에 여전히 여러 가지 문제가 있습니다.
먼저 텍스트 편집기는 다음과 같습니다.이것99%의 경우 스크립트를 작성하는 올바른 방법입니다. echo 명령을 사용하여 수동으로 한 줄씩 빌드하는 것은 지루하고 이점이 없습니다. (나머지 1%는 친숙한 편집기가 없는 시스템에 있거나 프로그램을 사용하여 자동으로 스크립트를 생성해야 하는 합당한 이유가 있는 경우를 포함하며 둘 다 애플리케이션에 적용되지 않습니다) . )
첫 번째 줄은 이어야 #!/bin/tcsh -f
하지만 그렇지 않습니다 #!/bin/tcsh
. -f
시작 파일( .tcshrc
, .cshrc
, )을 가져오지 않도록 지시 .login
하면 스크립트가 자체 포함됩니다. 그것이 부족해 -f
도 아무런 문제가 발생하지 않을 수도 있지만, 가지고 있는 것이 좋습니다. (참고: 이는 sh
또는 스크립트 에는 적용되지 않습니다 bash
. 해당 쉘의 경우 -f
완전히 다른 것을 의미합니다.)
이 줄은:
sed "s/_/-/g" $sql
각 파일을 읽고 모든 밑줄을 하이픈으로 변경합니다. 그러나 출력은 stdout에 기록됩니다.아니요입력 파일로 돌아갑니다. 파일 자체는 변경되지 않았습니다. 왜냐하면 당신이 이렇게 했기 때문입니다:
echo You changed $n files
내 생각엔 이것이 당신의 계획에 맞지 않는 것 같아요.
파일을 제자리에서 수정하는 것은 실제로 매우 까다롭습니다. 나는 다음과 같이 할 것입니다 :
sed "s/_/-/g" $sql > $sql.tmp && mv $sql.tmp $sql
그러면 파일이 수정되어 $sql
수정된 버전이 임시 파일에 기록됩니다. 만약에성공하면 임시 파일 이름이 $sql
.
비슷한 작업을 수행할 수 있는 -i
옵션 도 있습니다 .sed
sed -i.bak "s/_/-/g" $sql
들여쓰기는 당신의 친구입니다. 코드 구조를 표시하려면 foreach
와 줄 사이의 모든 내용을 들여쓰기해야 합니다. end
(저는 4개의 공백을 사용합니다. 어떤 사람들은 다른 수의 공백을 선호하거나 탭을 사용합니다.)
마지막으로 스크립트 자체 chmod 777 test
에 표시되어서는 안 됩니다 . 스크립트를 실행 가능하게 test
만들려면 명령줄에서 명령을 실행해야 합니다 . 스크립트를 읽기 쉽고 실행 가능하게 만드는 것은 나쁜 생각입니다 test
.777
쓰기 가능시스템의 모든 사람이. 대신 사용하십시오 chmod +x test
.
./test
를 입력하는 것이 아니라 입력 하여 스크립트를 실행해야 합니다 test
. (귀하의 질문에 따르면 이미 이 작업을 수행하고 있습니다.) 그렇지 않으면 test
스크립트 대신 내장 명령을 실행하고 있을 수도 있습니다 . (a) 구문을 사용하여 일관되게 호출 하고 test
( b ) ../test
.
$PATH
많은 스크립트를 작성하는 경우 sh
또는 bash
대신 csh
또는 사용을 고려해야 합니다 tcsh
. 이 기사이유를 설명했습니다.
마지막으로(그리고 이것이 아마도 여기서 가장 중요한 교훈일 것입니다) 실제로 무엇을 하고 싶은지 말하지 않았습니다. 나생각하다밑줄을 하이픈으로 바꿔 일부 파일의 내용을 수정하려고 합니다. 아니면 이름은 변경하고 내용은 변경하지 않겠습니까? 우리에게 보여준 것은 코드 덩어리뿐이므로 무엇을 하려는지 판단하는 것은 불가능합니다.그건 작동하지 않아. 작동하지 않는 코드를 우리에게 보여주는 것은 문제가 아니지만, 당신이 성취하고 싶은 것을 영어로 우리에게 말하지 않는 한 그것을 고치는 방법에 대해 조언할 수 없습니다.
답변3
권장되는 대로 편집기를 사용하여 쉘 스크립트를 작성하십시오.
수정사항은 다음과 같습니다.편집된 버전:
"명령을 찾을 수 없음" 오류 메시지를 제거하는 set n=0
대신 다음을 작성해야 합니다 .n=0
foreach sql ( *_*.sql )
바꾸다foreach sql *_*.sql
대신 .end
End
sed의 매개변수를 인용하는 "
것이 아니라 일반적인 인용이 필요합니다 .“